先把代码搬出来,我参照的教科书式算法第四版,在我自己看完后,有点晕,然后我就试试自己写一遍。
我将所有功能集合到一个类中,我实现的是3向切分的快速排序,使用了随机获取切分点。这样做有几个优点,首先是对于数组中有大量重复元素情况下,3分法表现更好,因为当出现重复元素时,并未交换元素。随机获取切分点可以使得最坏情况的出现几率大幅下降,比如每次切分点都是最大或者最小值。 .h
/* author : yb time: 2016 12 2 edition: 1.0 describe:快速排序的实现 */ class Cquick { public: Cquick(); Cquick(int n); void exchange(int i , int j);//交换2个数 void quickSort(int lo,int ed); //void partition(int lo, int ed); void show(); private: int *a; int Num; };.cpp
/* author : yb time: 2016 12 2 edition: 1.1 describe:快速排序的实现 */ #include "quick.h" #include <iostream> #include <stdio.h> using namespace std; Cquick::Cquick(int n):Num(n) { a = new int[n]; for (int i = 0 ; i<n;i++) { a[i] = rand()%100; } } void Cquick::exchange(int i , int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } void Cquick::quickSort(int lo , int ed)//出现个问题,晕晕乎乎的,第一:迭代没写返回条件 if (lo >= ed) { return; } int k = rand()%(ed-lo);//版本1.0,int k = rand()%(Num-1)这里的k不对,修改 int val = a[k +lo]; //cout<<"K:"<<k<<endl; int i = lo; int it = lo; int j = ed; while (i <= j) { if (a[i] < val) { if (i != it)//i和it不相等的时候才交换 { exchange(i , it); } i++; it++; } else if (a[i] > val) { exchange(i ,j); j--; } else { i++; } } quickSort(lo , it - 1 ); quickSort(i , ed); } void Cquick::show() { for (int i = 0;i<Num;i++) { cout<<a[i]<<" "; } } //测试 void main() { Cquick myquick(20); myquick.show(); cout<<endl<<"after quick sort:"<<endl; myquick.quickSort(0,19); myquick.show(); }