*partition2(A,p,r)
* {
*
* //优化三点中值法优化代码防止迭代层数过高
* * midIndex = p + ((r-p)>>1)//中间下表
* * midValueIndex=-1
* * if(A[p]<=A[midIndex]&&A[p]>=A[r])
* * {
* * midValueIndex=p
* * }
* * else if (A[r]<=A[midIndex]&&A[r]>=A[p])
* * {
* * midValueIndex=r
* * }
* * else {
* * midValueIndex=midInex
* * }
* * swap(A,midValueIndex,p) //p里面放的就是中值元素
* pivot =A[p];
* left = p+1;
* right = r;
*
* 优化2 运用绝对中值法进行找到中间值
* 优化3,根据算法的复杂度进行
* 当列表足够短时用插入排序
* if (r-p+1<=8)
* insertSort()
* else
* quicksort
*
* while(left<=right)
* {
* //left 不停往右走,直到遇到大于主元的的元素停下
* while(left<=right&&A[left]<=pivot) left++;//循环退出时,left一定是第一个大于主元位置,防止一直往前冲越界
* while(left<=right&&A[right]>pivot) right--;//循环退出时,right一定是最后一个小于等于主元位置
* if (left<right) // 防止交换出现问题
swap(A,left,right)
* }
* //while退出时,两者交错,right应该是最后一个小于等于主元位置,是主元应该待的位置
* swap(A,p,right);
* return right;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/***
* 归并排序的思路是重在归并,快速排序是重在划分,两者不同
* 思路:merge排序用两个指针,和一个开辟好的额外的一莫一样数组
* 指针进行移动比较大小值,覆盖原数组
* mergeSort(A,p,r):
* if (p<r){
* mid = p+((r-p)>>1)划分
* mergeSort(A,p,mid)//解决
* mergeSort(A,mid+1,r)解决
* merge(A,p,mid,r)//归并
*
* }
* helper=[A.length]
* merge(A,p,midIndex,r):
* copy(A,p,helper,p.r-p+1)
* left = p //左侧队伍的头部指针,指向待比较元素
* right= mid+1//左侧队伍的头部指针,指向待比较元素
* current=p//原数组指针,指向待填入的元素的位置
*
* while(left<=mid&&right<=r)
* if (helper[left]<=helper[right])
* {
* A[current] = helper[left]
* current++;
* left++;
*
* }
* else{
* A[current]=helper[right];
* current++;
* right++;
* }
* //当左侧没有比较完成
* while(left<=mid)
* {
* A[current] =helper[left];
* current++;
* left++;
* }
*
*
*/
本文介绍了一种改进的快速排序算法,通过优化三点中值法确定分区基准,结合绝对中值法和自适应策略,当列表较短时切换到插入排序。同时,展示了归并排序与快速排序的融合思想,以提升排序效率。

被折叠的 条评论
为什么被折叠?



