实现快速排序
- 例输入:{6 ,1 , 2 ,7 , 9 , 8 , 4 , 5 ,10 , 8}
算法大致思路
-
算法总体思路如下:每一轮排序中,每次都以第一个元素作为标准,将小于其元素的数放在左边,大于其元素放在右边。也就是说每经过一次排序,都确定了第一个数位置,并且以该数为分界线,将该数组分成了两个小数组。再将这两个小数组分别进行刚刚的排序即可。
-
算法过程:第一轮 双指针 begin = 0, end = 9, temp = N【begin】= 6
-
i = begin , j = end
-
从右边 j 指针往左找第一个小于6的数——5
-
从左边 i 指针往右找第一个大于6的数——7
-
将 5 和 7 的位置进行互换 ——此时【6 ,1 , 2 ,5 , 9 , 8 , 4 , 7 ,10 , 8】
-
再从右边 j 指针往左找第二个小于6的数——4
-
再从左边 i 指针往右找第二个大于6的数——9
-
将 9 和 4 的位置进行互换——此时【6 ,1 , 2 ,5 , 4 , 8 , 9 , 7 ,10 , 8】
-
再从右边 j 指针往左找第三个小于6的数——4
-
此时 j = 4 i = 4,所以结束第一轮的查找
-
将 N【i】和 N【begin】进行互换——此时【4 ,1 , 2 ,5 , 6 , 8 , 9 , 7 ,10 , 8】
-
-
下一轮只需要将左右两个数组进行同样的操作即可!
实现
- 第一:一定是先从右边开始找,右指针先动,因为我们要确保最后找到的数一定是小于temp的
- 第二:在指针寻找的时候,比较 temp 时等于号也是要的,因为不加等于号那么在遍历到等于temp的数时也会停止
- 第三:在指针寻找的时候,必须要有 i < j 的判断条件
public static void quickSort(int[] nums,int begin, int end){
if(begin > end) return;
int temp = nums[begin];
int i = begin;
int j = end;
while(i < j){
//等于号不能丢 并且 一定是先从右边开始找 因为最后交换的数一定是小于等于基准数的的
while(nums[j] >= temp && i < j){ //从右边开始找
j--;
}
while(nums[i] <= temp && i < j) { //从左边开始找
i++;
}
if( i < j){ //进行交换
int tempx = nums[i];
nums[i] = nums[j];
nums[j] = tempx;
}
}
nums[begin] = nums[i]; //这里一定用i 因为i一定是小于numsp[begin]的
nums[i] = temp;
quickSort(nums,begin,i- 1);
quickSort(nums,i+1,end);
}
总结
- 实现这个要对快排有一个深入的了解,总体架构就是一个while大循环 里面有两个while小循环,分别是右指针和左指针的遍历
- 然后while大循环的内外各有两次元素交换!