3.3快速排序
总结:
其实就是用到了递归的思想,来一点一点的拆,然后在使用归并的方式来进行排序
思路:
- 先拆成两部分
- 左面都是小的,右面都是大的
- 左右两面继续拆成两部分——这样递归下去
- 就可以得到一个有序的数列
图解:
1. 只要比这个线(所在的值)大的都往右移动,小的往左移动
- 这里有两个数字来标识当前比较的数字,一直找到这两个数字重合【重点】
- 当左标识遇到交换的时候,交换后,就开始从右标识开始向左比较
- 当右标识遇到交换的时候,交换后,就开始从左标识开始向右比较
2. 左面小的部分,按照上面的方式在进行递归【右面同理】
代码实现原理:
1. 首先找两个标记和一个基准数【一般用开头的数字】
- 只要比基准数大的都往右移动,小的往左移
2. 先从右边向左遍历,判断6>3
,所以不用动(就在3的右边),然后将6下的标记向前移动一位
3. 这时候2<3
,将2的数字复制,直接替换左标记3的值,然后将左标记右移动一位
4. 这时候5>3
,将左标记5的数字复制,直接替换右标记2的值,然后将右标记左移动一位
5. 这时候1<3
,将右标记1的数字复制,直接替换左标记5的值,然后将左标记右移动一位
6. 这时候7>3
,与上述同理
7. (8,9,5)都>3,所以不用交换,光移动标记即可
8. 当两个标记重合之后,将基准数字3,替换(标记重合的)7这个数字
结束:以标记点后为分割线,后面部分都>3,然后以递归的操作来排序前面部分和后面部分,无限递归下去,就可以得到结果了
- 递归的结束条件:只有一个数字的时候
代码阶段:
package main.java.com.LiKou.arithmetic;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {3, 4, 6, 7, 1, 2, 0, 8};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int start, int end){
if(start < end){
int stard = arr[start];
int low = start;
int high = end;
while (low < high){
while(low < high && stard <= arr[high]){
high--;
}
arr[low] = arr[high];
while (low < high && stard >= arr[low]){
low++;
}
arr[high] = arr[low];
}
arr[low] = stard;
quickSort(arr, start, low);
quickSort(arr, low + 1, end);
}
}
}