[剑指Offer]快排

Posted coding-gaga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指Offer]快排相关的知识,希望对你有一定的参考价值。

快排

看到一篇博文提到“东拆西补"的思想,非常贴切了。
这里采用传统的方法,没有采用剑指Offer书上的方法。
细节很多,需屏幕快照 2019-02-25 下午8.07.56.png
巩固。

其他知识点

生成一个范围内随机数

见代码,这里为包含左右两端点。
srand((unsigned)time(0))用来随机生成随机数种子。rand()生成随机数。

数组做形参

数组具有不能传值的特性,当把数组作为形参,实际是把指向数组首元素的地址作为参数传递。
int partition(int *num,int start,int end)
int partition(int num[],int start,int end)

待解决

异常的解决还需要改,
现在遇到异常会输出:terminating with uncaught exception of type char const*

代码

#include <iostream>
#include <time.h>

using namespace std;

int randomInRange(int start,int end){
    if(end<start){
        throw "Invaild paramters of randomInRange";
    }
    else{
        srand((unsigned)time(0));
        return start+rand()%(end-start+1);
    }
}

void swap(int &a,int &b){//注意
    int temp=a;
    a=b;
    b=temp;
}

int partition(int *num,int start,int end){
    if(num==nullptr||start<0||(end-start)<0){//注意end-start=0可以;书上partition加了数组长度的形参      
        throw "Invaild paramters of partition";//,并要限制数组的长度大于0以及end在范围内,这里未做。
    }
    int index=randomInRange(start, end);
    swap(num[index], num[start]);
    int tempElm=num[start];
    int i=start;
    int j=end;
    while(i<j){
        while(i<j&&num[j]>=tempElm){//注意>=,因为等于基准元素的元素分在它的左右两边都可以
            --j;
        }
        if(i!=j){
            num[i]=num[j];
            ++i;
        }
        while(i<j&&num[i]<=tempElm){//注意>=
            ++i;
        }
        if(i!=j){
            num[j]=num[i];
            --j;
        }
    }
    num[i]=tempElm;
    return i;
}

void quickSort(int *num,int start,int end){
    if(start==end){return;}
    int index=partition(num, start, end);
    if(index>start){//注意
        partition(num, start, index-1);
    }
    if(index<end){//注意
        partition(num, index+1, end);
    }
}

int main(int argc, const char * argv[]) {
    int num[]={3,4,5,1,1,2};
    int len=sizeof(num)/sizeof(int);
    quickSort(num, 0, len-1);
    for(int i=0;i<len;i++){
        cout<<num[i]<<" "<<endl;
    }
    return 0;
}

reference

https://www.zybuluo.com/Ggmatch/note/1036346
https://blog.csdn.net/yuhan_9204/article/details/46427533

以上是关于[剑指Offer]快排的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode1738. 找出第 K 大的异或坐标值(快排堆排序)/ 剑指 Offer 48. 最长不含重复字符的子字符串 / 剑指 Offer 49. 丑数

[剑指 Offer 40]. 最小的 k 个数

[剑指 Offer 40]. 最小的 k 个数

剑指offer(28)

最小的k个数(剑指offer 40)

LeetCode 面试题 17.14. 最小K个数(堆排,快排)/剑指 Offer 10- I. 斐波那契数列 /470. 用 Rand7() 实现 Rand10()(拒绝采样,学!!!)