快速排序(优化版)

来源:互联网 发布:阿里云 多隆 编辑:程序博客网 时间:2024/05/16 05:27
#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();}

原创粉丝点击