首先先了解快排的几个步骤:
-
快排需要一个临界点
-
基于临界点,将数组分割成左右两部分,左边的数据小于临界点,右边的数据大于临界点
-
将左右两边的数据可以看做一个分割的数组,重复步骤1,2,直到数组分割的数组不符合常规数组(数组低位索引大于的等于高位索引)
图解快排,假如有一组整数数组 int[] a = {5,2,6,4,8,7.0,9,1,3}; 注:这里我选择数组的下标最小值为临界点,图片红色代表有序的数据,字体加粗代表分割要排序的数组。
1.数组初始值,5位临界点
2.第一轮获取临界点5排序后所在数组的索引值是5,左边加粗的数据小于5,下轮进行排序,下轮临界点为2
3.第二轮获取临界点2排序后所在数组的索引值是2,左边加粗的数据小于2,下轮进行排序,下轮临界点为2
4.第三轮获取临界点为0,排序后所在数组的索引值为2,左边没数据,下轮对0右边的数据进行排序,下轮临界点为1,下轮数据只有一个,是1
5.第四轮获取临界点为1,排序后所在数组据的索引值为1,左右两边没数据,下轮对4,3进行排序,下轮临界点为4
后面的描述就不重复了,我这里直接上图了
代码实现
package com.algorithms.sort; public class QuickSort { public static void sort(int[] a){ sort(a,0,a.length-1); } private static void sort(int[] a, int low, int height){ if(low >= height){ return; } int j = partition(a,low,height); sort(a,low,j-1); sort(a,j+1,height); } /** * 将数组low-height之间区确定a[low]在数组中的位置并返回索引值 * @param a * @param low * @param height * @return 返回数组固定顺序的索引值 */ private static int partition(int[] a, int low, int height) { //需要确定位置的数据,临界值 int v = a[low]; //索引开头 int i = low; //需要确定位置的数据初始索引 int index = low; //遍历比较数据 while (true){ //比较数据比要比较的数据小,将数据放到索引位置,索引位置+1 if(a[++i] < v){ a[index++] = a[i]; //游标,比临界值大的数据往后以 int cursor = i; //游标值大于索引值,数组后移动 while (index < cursor){// a[cursor] = a[--cursor]; } } //返回跳出 if(i == height) { a[index] = v; return index ; } } } }
创作不易,您的支持是我最大的动力。请支持一下或关注一下