快速排序(优化版)

#include<iostream> #include<cstdlib> #include<ctime> using namespace std; void swap(int& big, int& small) { int temp = big; big = small; small = temp; } int partition(int data[],int left,int right) { int base=data[right]; //以最后一个元素,data[right]为参照物 int i=left-1; /* |这里运用的是观察者模式,i是一个旁观者 | |游标j从左至右迭代,当if语句只判断data[j]<base情况 |也就是说data[j]>base时的时候只是执行外层for循环,并移动游标j | |若序列开始部分的若干数据小于base时,就不执行i和j的值swap()交换。 | |当arr[j]>base时,执行外层for循环。此时区间[0 : i]的取值都是小于base的 |且区间[i:j]的值都是大于base的。记着 @_1 | |当再次出现arr[j]<base时。i += 1 ,由上述@_1得知此时的arr[i]>arr[j],执行交换 |继续for循环 | |当j == right时,for 循环结束。此时我们知道:区间[0 : i]的取值 |都是要小于区间[i : j]的取值的。记着 @_2 | |现在由于j迭代到right时已经退出循环,此时没有进行arr[j]和base的比较 |也就是没有进行base和arr[i]的比较。 |但我们知道区间[i+1 : j-1]的取值都是大于base的 记着@_3 */ for(int j = left; j < right; j++) { if( data[j] <= base) { i += 1; if (data[i] != data[j]) //毕竟比较两个数的大小要比复制数据在效率上更高 swap(data[i],data[j]); //显然,不论怎样,小数值总是要放在左边的 } } /* |由@_3得知,区间[i+1 : j-1]都是大于base的 |这里执行一次优化,既然arr[i+1]>base |那么就交换arr[i+1]和base的取值。 |此时的序列中,区间[0 : i]都是小于区间[i : j]的 |但以i为分隔的前后序列都还不是有序的,所以传回分解符的位置到quicksort |继续递归迭代。 */ swap(data[i+1],data[right]); return i+1; } void quickSort(int data[], int left, int right) { if (left < right) { int index = partition(data, left, right); quickSort(data, left, index - 1); quickSort(data, index + 1, right); } } void main() { srand(unsigned int(time(NULL))); const int size = 100; const int size_seed = 100; int iarray[size]; for ( int i = 0; i <= size; i++ ) iarray[i] = (rand()%size_seed+ 1); // clock_t begin = clock(); quickSort(iarray, 0, size); // clock_t end = clock(); // double result = difftime(end, begin); for (int j =0; j <= size; j++ ) cout << iarray[j] << " "; /*清空内存缓冲区的数据,因为此时数据已经写入到显存中*/ // cout<<"quick sort cost " << result/CLOCKS_PER_SEC << "seconds" << endl; cout.flush(); cin.get(); }

你可能感兴趣的:(快速排序)