思想原理: 通过一趟排序,将以某个元素为基准分为左右两个子序列,左序列所 有元素都小于基准元素,右序列所有元素大于基准元素。然后再分别对左右序列进行同样的排序方法,以此递归下去得到结果。
实现思路: 基准元素是每次在排序前自己规定好的,那么我就自己规定每次给未排序序列的第一个元素为基准,其他元素与基准进行比较,比基准大的放左边,反之右边,以此递归下去。
举例:假设基准为未排序序列的第一个元素
int[] array = {12, 23, 6, 56, 32, 2, 5, 10, 47, 9};
.
array 12 23 6 56 32 2 5 10 47 9 以array[0]为基准,经过一趟排序后:
.
array 9 10 6 5 2 12 32 56 47 23 由上可知,以红色元素为基准的最初序列变成两部分,采用递归的方法对子序列进行相同方式的排序。
.
疑问解释:可能大家觉得一趟排序完后,元素的顺序什么是这样的,兄弟莫慌, 往下看我写的实现代码,如若不懂请留言,后续补上!
代码:
public class QuickSortTest {
public static void main(String[] args) {
int[] array = {12, 23, 6, 56, 32, 2, 5, 10, 47, 9};
System.out.println("初始顺序:"+Arrays.toString(array));
quickSort(array, 0, array.length-1);
System.out.println("结果:"+Arrays.toString(array));
}
static void quickSort(int[] array, int low, int high){
if (low < high) {
//得到排序后基准元素位置
int mid = getMiddle(array, low, high);
System.out.println("在序列范围["+low+","+high+"]排序后:基准位置是:"+mid+","+Arrays.toString(array));
quickSort(array, low, mid-1);
quickSort(array, mid+1, high);
}
}
private static int getMiddle(int[] array, int low, int high) {
int temp = array[low];
while(low < high){
//array[high] >= temp, 切记是>=, 不然会死循环
while(low < high && array[high] >= temp)
high--;
array[low] = array[high];
while(low < high && array[low] <= temp)
low++;
array[high] = array[low];
}
array[low] = temp;
return low;
}
}
打印结果:
初始顺序:[12, 23, 6, 56, 32, 2, 5, 10, 47, 9]
在序列范围[0,9]排序后:基准位置是:5,[9, 10, 6, 5, 2, 12, 32, 56, 47, 23]
在序列范围[0,4]排序后:基准位置是:3,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[0,2]排序后:基准位置是:0,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[1,2]排序后:基准位置是:1,[2, 5, 6, 9, 10, 12, 32, 56, 47, 23]
在序列范围[6,9]排序后:基准位置是:7,[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]
在序列范围[8,9]排序后:基准位置是:8,[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]
结果:[2, 5, 6, 9, 10, 12, 23, 32, 47, 56]
LZ本着能少pilibala就少pilibala的原则做事,如果不懂,请留言。 相互学习交流~^_^