描述思想:选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后,取基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各子序列剩余一个元素时,即排序完成。
1 /**
2 * 快速排序
3 * 思路:选取基准元素tmp = arr[start],先后从往前遍历,如果tmp < arr(end),则end--,
4 * 直到tmp >= arr(end),此时让arr[start]=arr[end]
5 * 然后从左往右遍历,如果tmp > arr[start],start++,
6 * 直到tmp <= arr[start],此时让arr[end]=arr[start]
7 *
8 * 这样遍历一次之后,tmp所在的位置就是中间位置,同理,遍历tmp左边和右边的子数组。
9 * 最终循环结束,就是有序的数组
10 * @param arr - 数组
11 * @param start - 起始位置
12 * @param end - 结束位置
13 */
14 public static void quickSort(int [] arr, int start, int end) {
15 //数组arr空or仅有一个元素则退出
16 if (start >= end - 1)
17 return;
18
19 if (start < end) {
20 //寻找基准元素的位置
21 int index = getIndex(arr, start, end);
22
23 //遍历index位置左边和右边的子数组。
24 quickSort(arr, 0, index - 1);
25 quickSort(arr, index + 1, end);
26 }
27 }
28 public static int getIndex(int [] arr, int start, int end) {
29
30 //选取基准数据
31 int tmp = arr[start];
32
33 while (start < end) {
34 //开始从右往左遍历,当队尾元素大于等于tmp时,向前挪动指针
35 while (start < end && tmp <= arr[end]) {
36 end--;
37 }
38 //执行到这里说明tmp大于arr[end]了,让end位置的值赋值给start位置的值
39 arr[start] = arr[end];
40
41 //开始从左往右遍历,当队首元素小于等于tmp时,向后挪动指针
42 while (start < end && tmp >= arr[start]) {
43 start++;
44 }
45 arr[end] = arr[start];
46 }
47
48 //执行到这里,start和end肯定相等,也就是tmp的位置,需要将tmp赋值给arr[start]
49 arr[start] = tmp;
50 return start;
51 }
52
53 public static void main(String[] args) {
54 int [] arrs = {8,12,6,13,4,23};
55 quickSort(arrs, 0, arrs.length - 1);
56 System.out.println("=====排序之后======");
57 for(int e : arrs) {
58 System.out.print(e + " ");
59 }
60 }