思路和伪代码如下:需要的小伙伴们自己实现
/****
* 分治思想:划分子问题再合并
* 快排的重点是划分,归并的重点是合并
* 快速排序:1,分解,解决,合并
* 一遍单向扫描法:
* 定主元,两个指针,一个是sp后面扫,另一个b指针
* 小于等于 sp右移,大于的bigger左移关键找出分
* 伪代码如下
* quickSort(A,p,r)
* if (p<r)
* q= partition(A,p,r)
* quickSort(A,p,q-1)
* quickSort(A,q+1,r)
* paraition(A,p,r)
* p = A[p]
* scanner =p+1
* int bigger =r;
* while(scanner<=bigger):
* if(A[scanner]<p):
* scanner++;
* else
* swap(A,sanner,bigger)
* bigger--
* swap(A,p,bigger)
* return bigger
*
*/
/*****
* 分割元素的另一种是双向扫描法
* 思路:左右指针一起移动,left遇到第一大于主元的
* 停止,right遇到第一个小于主元的停止,两者进行
* 交换再次移动。直到边界处,rigth小于left,然后把
* right和主元位置互换
* 伪代码:
* partition(A,p,r)
* {
* int pivote = A[p]
* int r =A.length-1
* left=p
* right = r
* while(left<=right)
* if A[left]<=pivote && A[right]>pivote
* left++;
* right--;
* else if A[left]<=pivote && A[right]<pivote
* left++;
* else if
* right --
* swap(A,left,right)
* left++;
* right--
* swap(A,p,right)
* return right
* // 伪代码2
* partition2(A,p,r)
* {
* pivot =A[p];
* left = p+1;
* right = r;
*
* 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;
*
* }
/**
*快速排序三指针法用于数组中和主元重复过多的排序
* 思路:三个指针一个是scanner,一个是equal,一个是bigger
* 小于主元,s和e的位置交换,e++,s++
* 等于主元 s++
* 大于主元,s和bigger交换,bigger--
* 边界考虑是s和bigger交错,
* 结尾是e--, e和p交换,返回的区间是[e,b]区间,e永远指向第一个
* 等于主元位置,b指向最后一个等于主元位置
*然后进行迭代求 (l-q1-1) q2 (q2+1,r)
* 伪代码如下:
* int [] partition(A,p,r)
* pivot = A[p]
* sp = p+1
* e=p
* bigger=r
* while(sp<=bigger)
* if (A[sp]<pivot)
* swap(A,sp,e)
* e++;
* sp++;
* else if (A[sp]==pivot)
* sp++
* else
* swap(A,sp,bigger)
* bigger--
* e--
* swap(A,e,sp)
* return [e,b]
*
*
*
*/