ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-07 09:04:03  阅读:150  来源: 互联网

标签:vector clock int ++ 哈工大 QuickSort1 swap 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;
}

 

标签:vector,clock,int,++,哈工大,QuickSort1,swap,2022,排序
来源: https://www.cnblogs.com/WTSRUVF/p/16350522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有