Random Quick Sort Test

140 篇文章 0 订阅
111 篇文章 0 订阅
#include"MyOutput.hpp"


template<typename T>
int partition(T a[],int p,int r){
    
    T x = a[p];//将首元素设置为哨兵
    int i=p+1;//从首元素的下个元素开始比较
    int j=r;
    

    //这里先++i,++j增(减)再比,很重要
    while(true){
        //不要a[i++]或a[j--]执行后,i会+1,j会-1,造成swap 数据 错误.
        while( x > a[i] && i < j){
            i++;
        }
        while( x < a[j]){
            j--;
        }
        if(i>=j)break;
        swap(a+i,a+j);
        /**
         * 对于重复的数字:如 9 9 9 8 10
         * 如果不 i++ 和 j--
         * 将重复 9 比较 9 
         * 因为 以上循环中 是先比较 > < 不是 <= >=,再次+1 -1,
         * 
         * 会不会 越界 呢 ? 如 i++ 后 i > n,j--后 j<0 
         * 5 4 3 2 1 ; x = 5, i = 1 , arr[i++] < x;约束 i < j ,所以 最终 i = j = 4; arr[j=4] < x;
         * i>=j (4>=4) break;arr[j=4] = x = 5;arr[0] = 1;return j=4;
         * 
         * 6 7 8 9 10; x = 6, i = 1 , arr[i] > 6, j = 4,a[j--] > x => j = 0 (6 > 6)
         * i>=j (1>=0) break; a[p=0] = a[j=0]; a[j=0] = x (=a[p]),return j=0;
         * 
         * 
         * 
         */ 
        i++;
        j--;
        // println("i=",i," ; j=",j);
    }
    
    a[p] = a[j];
    a[j] = x;
    // println(j);
    return j;
}

template<typename T>
int randomizedPartition(T a[],int p,int r){
    srand(time(nullptr));
    int i = rand()%(r-p + 1) + p;
    swap(a+i,a+p);//与首元素交换,这样就不用修改patition的code了
    return partition(a,p,r);
}

//ASC
template<typename T>
void RandomizedQuickSort(T a[],int p,int r){
    if(p<r){
        
        int q = randomizedPartition(a,p,r);
        // printlnArr(a,10);
        // println(q);
        RandomizedQuickSort(a,p,q-1);
        RandomizedQuickSort(a,q+1,r);
    }
}


int main(){

    constexpr int len = 10000;
    int a[len] = {0};
    createRandomArrayWithBase(a,len,len);
    // printlnArr(a,len);
    TimeSpec::begin();
    RandomizedQuickSort(a,0,len-1);
    TimeSpec::print_cost_time();
    // printlnArr(a,len);
    println("======================================");
    constexpr int len2 = 100;
    int b[len2] = {0};
    createRandomArrayWithBase(b,len2,len2);
    printlnArr(b,len2);
    TimeSpec::begin();
    RandomizedQuickSort(b,0,len2-1);
    TimeSpec::print_cost_time();
    printlnArr(b,len2);


    return 0;
}

From beginning to end totally costs: 0.002 s
======================================
[29,12,8,14,17,6,69,16,65,7,38,93,8,17,93,46,83,79,74,60,54,58,51,35,41,96,64,6,30,89,88,8,78,57,48,92,14,29,32,4,71,4,3,30,71,26,30,8,95,84,21,51,38,87,6,98,75,14,82,68,26,5,22,62,74,40,41,77,71,50,70,99,34,54,64,44,90,91,20,72,54,88,19,59,26,39,0,33,22,13,60,51,60,26,73,85,58,93,8,4]
From beginning to end totally costs: 0 s
[0,3,4,4,4,5,6,6,6,7,8,8,8,8,8,12,13,14,14,14,16,17,17,19,20,21,22,22,26,26,26,26,29,29,30,30,30,32,33,34,35,38,38,39,40,41,41,44,46,48,50,51,51,51,54,54,54,57,58,58,59,60,60,60,62,64,64,65,68,69,70,71,71,71,72,73,74,74,75,77,78,79,82,83,84,85,87,88,88,89,90,91,92,93,93,93,95,96,98,99]








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值