快速排序算法,在剑指offer里面的一种实现:
算法的整体采用递归,将数组分成两部分,前面一部分都比后面那部分的值小,而将这两部分再接着进行递归的排序.
这其中最重要的是怎么去将其分成两部分,剑指offer上的办法是采用从前往后的遍历,将最后一个值end处作为中间的关键字,然后两个指针,一个是遍历的index,一个是比它小的个数small.
而在大话数据结构中采用的是两边往中间的方法方法来将数组分成两部分.low和high分别的low++和high--.要是low处值大于关键值,将low处值与high处值交换,要是high处的值比关键值小.将high处的值与low处的值交换.直到low与high相遇,就退出循环,而这个时候的low=high且为其中间的关键值得下标.
#include <iostream> #include<vector> #include<time.h> #include<stdlib.h> using namespace std; int randnum(int a,int b); void swapd(int *a,int *b); //实现一个函数:将一个数组分成两半,在中间某处,左边都比右边要小 //返回的这个中间处的坐标号。 int partion(int vec[],int len,int start,int end) { int index=randnum(start,end); swapd(&vec[index],&vec[end]); int small=start-1; //将最后的那个数作为中间字,将比它小的放在它前面,比它大的放在它后面。 for(index=start;index<end;++index) { if(vec[index]<vec[end]) { ++small; if(small!=index)//若index处的值比end处的值小,就应该把它放在前面去。 swapd(&vec[small],&vec[index]); } } if(small!=index) swapd(&vec[small],&vec[index]); return small; } int randnum(int a,int b) { srand((unsigned)time(NULL)); return (rand()%(b-a+1))+a; } void swapd(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } //快排的整体思路,将数组分成两部分,前面的一部分都比后面一部分的值小,然后递归下去, //一直到全部排好序。 void kuaipai(int vec[],int n,int start,int end) { if(start==end) return; int mid=partion(vec,n,start,end); if(mid>start) kuaipai(vec,n,start,mid-1);//将前面那部分再接着进行排序 if(mid<end) kuaipai(vec,n,mid+1,end);//将后面那部分再接着排序。 return; } int main() { //cout<<randnum(1,8)<<endl; }
时间: 2024-10-08 19:35:11