一、测试数据准备阶段:
1.用rand()函数实现随机生成10w个-500~500的数据经过word文档处理空白后以作为10w无序数据样本。
2.用希尔排序排出逆序以作为逆序样本。
3.我选择leetcode 912题作为OJ评判。(手动输入(复制粘贴)这10w测试用例)
二.测试阶段。
1.普通无序情况下的时间测试(10w数据):(测试5次取平均数)
未经二分优化的普通快速排序:平均112.6ms
经过二分优化后的快速排序:平均122.4ms
2.逆序情况
未经二分优化的排序时间:平均549.6ms
经过二分优化后的时间:平均103.2ms
三.总结和二分优化代码
通过上述两者对比可发现普通快速排序在面对一般情形下,相比二分优化后的反而表现好一点点,但是在逆序情况下却比二分优化后的代码效率差了5倍左右,而二分优化后的代码在逆序情况下反而比一般情况要好一点.最后我认为,在面对局部逆序的情况下采取二分优化会快很多!
贴代码:
void quicksort(int* nums,int n)//应用二分思想
{ if (n<2) return;
int l=0,r=n-1;
int mid=nums[(l+r)/2];//中间数
while(l<=r){//这里和下面的'='千万不能省,这是让最后l和r的指向可能性只会有两种可能,要么l和r相邻(r左l右),要么l和r中间隔了一个数(那么这个数肯定是确定好位置的。l右r左)
while(nums[l]<mid) l++;//查找左半部分比中间数大的数
while(nums[r]>mid) r--;//查找右半部分比中间数小的数
if(l<=r)//如果有一组不满足排序条件(左小右大)的数
{/*交换值:这里注意有一个小坑,
不能用加法或者异或来实现值的交换,
因为当nums[i]和nums[j]指的是同一个变量时(i=j时),
就会出现bug。*/
int temp = nums[r];
nums[r] = nums[l];
nums[l] = temp;
l++;
r--;
}
}
quicksort(nums,r+1);//递归搜索左半部分
quicksort(nums+l,n-l);//递归搜索右半部分
//最后这个左右搜索部分元素一定不能重合,或者少包含了一些元素(除非是这一轮已经排好的这一个),就算你的左右搜索部分包含了原本已经确定了位置的元素,也没关系。
}