2022春季 哈工大 硕士算法设计与分析 实验四 快速排序

 

 

 

 

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6;

int Rand_Partition(vector<int> &A, int &p,int &r)
{
    // 随机生成锚点下标
    int i = rand() % (r - p) + p;

    swap(A[r], A[i]);

    int x = A[r];

    i = p - 1;

    for(int j = p; j < r; j++)
    {
        // A[j] < x时交换到前面,保证i + 1前面的都是小于x的
        if(A[j] < x)
        {
            i++;
            swap(A[i], A[j]);
        }
    }
    // 将x放到i + 1的位置
    swap(A[i + 1], A[r]);

    return i + 1;
}
// 只能保证小于的在左边,右边的为大于和等于的乱序
// 以q为划分边界,重复的元素也会处理
void QuickSort1(vector<int> &A, int p, int r)
{
    if(p < r)
    {
        int q = Rand_Partition(A, p, r);
        QuickSort1(A, p, q - 1);
        QuickSort1(A, q + 1, r);
    }

}


// 算法保证了与锚点相同的在中间,小于的在左边,大于的在右边
void QuickSort2(vector<int>& A, int l, int r)
{
    if(l >= r) return;
    int p = l, q = r;
    int i = rand() % (r - l) + l;
    int x = A[i];
    i = l;
    // 小于q,因为q后边的都是大于x的
    while(i <= q)
    {
        if(A[i] == x)
        {
            i++;
            continue;
        }
        else if(A[i] < x) swap(A[i++], A[p++]);
        // 因为前面的元素已经遍历过了,位置p之前一定是==x的元素,因此直接i++即可
        // 而后边换过来的元素并不知道其大小,因此i不变
        else swap(A[i], A[q--]);
    }
    // 注意划分区域,中间相同的不再处理
    QuickSort2(A, l, p - 1);
    QuickSort2(A, q + 1, r);
}

void DataGenerate(vector<int> &A, int k)
{
    A.clear();
    srand(time(0));
    int m = 1e5 * k;
    for(int i = 0; i < maxn; i++)
    {
        if(i < m)
            A.push_back(7);
        else
            A.push_back(i);
    }
    random_shuffle(A.begin(), A.end());

}


vector<int> A;
int main()
{

    int n;
    for(int i = 0; i < 11; i++)
    {
        DataGenerate(A, i);
        clock_t startTime, endTime;
        startTime = clock();
//        QuickSort1(A, 0, A.size() - 1);
//        sort(A.begin(), A.end());
        QuickSort2(A, 0, A.size() - 1);
        endTime = clock();
        cout << "the "<< i << "st sort which has "<< 1e5 * i << " repeat nums needs " << endTime - startTime << " ms" << endl;
    }







    return 0;
}

 

posted @ 2022-06-07 08:29  WTSRUVF  阅读(72)  评论(0编辑  收藏  举报