快速排序

描述思想:选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后,取基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各子序列剩余一个元素时,即排序完成。

 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     }

 

posted @ 2019-11-11 14:44  土豆Z120553  阅读(194)  评论(0编辑  收藏  举报