一.原理
快速排序:干说原理
- 先从数组中选出一个值,作为权重temp,然后从数组最右边high(其中一边都行)开始,向左边遍历(记最左边为low)
- 如果arr[high]比temp大,那么不管,high继续向左移动
- 如果arr[high]比temp小,那么此时
- arr[low] = arr[high]
- 当找到第一个赋值的地方的时候,不在继续high--;这个时候从左边开始
- 如果arr[low]比temp小,不管,low++
- 如果arr[low] 大于temp,那么第二次交换
- arr[high] = arr[low]
- 这时暂停low++,又需要回到high--.
- 如此交替,直到high和low重合:
- 这时high=low
- arr[low] = temp;
完成第一轮分组,把比temp大的数放到了右边,比temp小的数放到了左边.
再以刚刚的low为分界,递归调用,直到所有元素都满足小的在左边,大的在右边,完成排序
二.图解
干说太干,我们用图来理解
我们选择第一个元素为权重,从右边开始
接着以43为分界,前边从index=0到43的位置,递归此方法,后边亦如此.
java代码
package sort.quick;
import java.util.Arrays;
/**
* @description: 快速排序
* @author:tao
* @create: 2019-12-28 11:18
*/
public class QuickSort {
public static void main(String[] args) {
int []array = {5, 8, 6, 3, 9, 2, 1, 7};
System.out.println("原数组:" + Arrays.toString(array));
quickSort(array, 0, array.length - 1);
System.out.println("排序数组:" + Arrays.toString(array));
}
private static void quickSort(int[] array, int low, int high) {
if (low < high) {
int index = getEqualIndex(array, low, high);
quickSort(array, low, index - 1);
quickSort(array, index + 1, high);
}
}
private static int getEqualIndex(int[] array, int low, int high) {
int temp = array[low];
while (low < high) {
// 后往前
while (low < high && temp <= array[high]) {
high--;
}
// 交换(temp 比最后大)
array[low] = array[high];
while (low < high && temp >= array[low]) {
low ++;
}
array[high] = array[low];
}
array[high] = temp;
return high;
}
}
原数组:[43, 22, 49, 6, 5, 2, 50, 65]
排序数组:[2, 5, 6, 22, 43, 49, 50, 65]
交换次数=14