目录

sort

3796
#include <bits/stdc++.h>
#if !defined(ONLINE_JUDGE) && defined(LOCAL)
#include "debug.h"
#else
#define debug(...) ((void)0)
#endif
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
int r(int a, int b) {
    return rnd() % (b - a + 1) + a;
}




/*-----------------------------------冒泡排序-----------------------------------*/
void bubble_sort(vector<int>& a) {
    for (int i = 1; i <= a.size() - 1; i++) {
        for (int j = a.size() - 1; j >= i; j--) {
            if (a[j] < a[j - 1]) {
                swap(a[j], a[j - 1]);
            }
        }
    }
}

/*-----------------------------------插入排序-----------------------------------*/
// 保持一端有序,后面的不断和前面比较,选择合适的位置插入
void insert_sort(vector<int>& a) {
    for (int i = 1; i <= a.size() - 1; i++) {
        int k = a[i];
        int j = i;
        while (j >= 1 && k < a[j - 1]) {
            a[j] = a[j - 1];
            j--;
        }
        a[j] = k;
    }
}

/*-----------------------------------选择排序-----------------------------------*/
void select_sort(vector<int>& a) {
    for (int i = 1; i < a.size(); i++) {
        int k = i;
        for (int j = i + 1; j < a.size(); j++) {
            if (a[j] < a[k]) {
                k = j;
            }
        }
        swap(a[i], a[k]);
    }
}

/*-----------------------------------快速排序-----------------------------------*/
// 类似于归并排序,先在数组中选择一个数,分成最多三个区间:和它相等的数,比它小的数和比它大的数,递归式地进行。
void quick_sort(vector<int>& a, int begin, int end) {
    if (begin >= end)
        return;
    vector<int> b;
    for (int i = begin; i <= end; i++) {
        b.push_back(a[i]);
    }
    // int key = b[0];
    int random_index = r(begin, end);
    int key = a[random_index];
    int t = 0;
    int count = 0;
    for (int i = begin; i <= end; i++) {
        if (a[i] < key) {
            b[t] = a[i];
            t++;
        } else if (a[i] == key)
            count++;
    }
    int left = begin + t - 1;
    for (int i = 1; i <= count; i++) {
        b[t] = key;
        t++;
    }
    int right = begin + t;
    for (int i = begin; i <= end; i++) {
        if (a[i] > key) {
            b[t] = a[i];
            t++;
        }
    }
    for (int i = begin; i <= end; i++) {
        a[i] = b[i - begin];
    }
    quick_sort(a, begin, left);
    quick_sort(a, right, end);
}

/*-----------------------------------归并排序-----------------------------------*/
//不断地递归式地将待排序数组二分,然后合并。
void merge(vector<int>& b, int left, int right, int middle) {
    vector<int> L(middle - left + 1);
    vector<int> R(right - middle);
    for (int i = left; i <= middle; i++) {
        L[i - left] = b[i];
    }
    for (int i = middle + 1; i <= right; i++) {
        R[i - middle - 1] = b[i];
    }
    int t = left;
    int j = 0, k = 0;
    while (j < middle - left + 1 && k < right - middle) {
        if (L[j] <= R[k]) {
            b[t] = L[j];
            j++;
            t++;
        } else {
            b[t] = R[k];
            k++;
            t++;
        }
    }
    while (j < middle - left + 1) {
        b[t] = L[j];
        j++;
        t++;
    }
    while (k < right - middle) {
        b[t] = R[k];
        k++;
        t++;
    }
}
void merge_sort(vector<int>& b, int left, int right) {
    if (left == right)
        return;
    int middle = (left + right) / 2;
    merge_sort(b, left, middle);
    merge_sort(b, middle + 1, right);
    merge(b, left, right, middle);
}

/*-----------------------------------堆排序-----------------------------------*/
void modiup(vector<int>& a, int p) {
    while (p > 1 && a[p] > a[p / 2]) { 
        swap(a[p], a[p / 2]);
        p /= 2;
    }
}

void modidown(vector<int>& a, int p, int n) {
    int l = p * 2;
    while (l <= n) {
        int best = (l + 1 <= n && a[l + 1] > a[l]) ? l + 1 : l; 
        best = a[best] > a[p] ? best : p;
        if (best == p) {
            break;
        }
        swap(a[best], a[p]);
        p = best;
        l = p * 2;
    }
}
// 从底到顶建立大根堆,O(n)
// 依次弹出堆内最大值并排好序,O(n * logn)
// 整体时间复杂度O(n * logn)
void heapify(vector<int>& a, int n) {
    for (int i = n / 2; i >= 1; i--) { 
        modidown(a, i, n);
    }
}

void heap_sort(vector<int>& a) {
    int n = a.size() - 1;
    heapify(a, n);
    for (int i = n; i > 1; --i) {
        swap(a[1], a[i]);
        n--;
        modidown(a, 1, n);
    }
}

/*-----------------------------------排序测试-----------------------------------*/
//下标从1开始
//升序
int main() {
    const int number_count = 100000; // 要生成的随机数个数
    const int max_value = 1000000;   // 随机数的最大值

    vector<int> rd(number_count), mysort(number_count);
    for (int i = 1; i <= rd.size() - 1; i++)
        rd[i] = mysort[i] = r(1, max_value);
    
    sort(rd.begin() + 1, rd.end());
    auto start = chrono::high_resolution_clock::now();
    // bubble_sort(mysort);
    //insert_sort(mysort);
    //select_sort(mysort);
    //heap_sort(mysort);
    //quick_sort(mysort,1,mysort.size()-1);
    //merge_sort(mysort,1,mysort.size()-1);
    auto end = chrono::high_resolution_clock::now();
    chrono::duration<double> elapsed = end - start;

    bool f = 1;
    for (int i = 1; i <= rd.size() - 1; i++) {
        if (rd[i] != mysort[i]) {
            f = 0;
            break;
        }
    }
    if (f)
        cout << "排序结果正确!";
    else
        cout << "排序结果错误!";
    cout << endl;
    cout << "Time elapsed: " << elapsed.count() << " seconds" << endl;

    return 0;
}
```cpp

推荐文章

莫队
组合博弈