快速排序

快速排序是冒泡排序的升级,它们都是交换排序类。

快速排序(Quick Sort)基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的。

简单举例:

  一个自然数列:7、31、11、7、4,自然排序(由小到大)

  设:key=关键字值,界限left=在left之前都不大于key,界限right=在right之后都不小于key,条件left<right;描述:位置->值

  步骤:

    第一步:缩短界限right界限,right值与key交换

    第二步:缩短界限left界限,left值与key交换

    第三步:若left<right执行第一步  

  第一趟比较:

    1)key=7,left=1,right=5;缩短界限right界限得right=5,交换5->4与1->7得4、31、11、7、7

    2)left=2,right=3;缩短界限left界限得left=2,交换2->31与5->7得4、7、11、7、31

    3)left=2,right=5;left<right执行第一步,right=2

    4)left=right=2第一趟结束

    后续:以第一趟left,right位置拆分左右两部分,采用第一趟相同的策略分别比较;

代码实现:

  

 1 import java.util.Arrays;
 2 
 3 public class Sort {
 4     /**
 5      * 快速排序
 6      *
 7      * @param arr
 8      */
 9     private static void quickSort(int[] arr, int left, int right) {
10         int pivot;
11         if (left < right) {
12             pivot = partition(arr, left, right);
13             quickSort(arr, left, pivot);
14             quickSort(arr, pivot + 1, right);
15         }
16     }
17 
18     private static int partition(int[] arr, int left, int right) {
19         int key = arr[left];
20         while (left < right) {
21             //缩短right,使right值小于key
22             while (left < right && arr[right] >= key) {
23                 right--;
24             }
25             //使left=right值
26             if (left < right) {
27                 arr[left] = arr[right];
28             }
29             //缩短left,使left值大于key
30             while (left < right && arr[left] <= key) {
31                 left++;
32             }
33             //使right=left值
34             if (left < right) {
35                 arr[right] = arr[left];
36             }
37             arr[left] = key;//设置key
38         }
39         return left;
40     }
41 
42     public static void main(String[] args) {
43         int arr[] = {1, 331, 2, 5, 6, 12, 312, 13, 1, 33, 123, 7, 12, 17, 444, 11, 3, 14, 1, 33, 1, 2};
44         int qrr[] = Arrays.copyOf(arr, arr.length);
45         int jrr[] = Arrays.copyOf(arr, arr.length);
46         quickSort(qrr, 0, arr.length - 1);
47         System.out.println("quickSort:" + Arrays.toString(qrr));
48         Arrays.sort(jrr);//api 排序
49         System.out.println("api排序   :" + Arrays.toString(jrr));
50     }
51 }
快速排序

 

   

    

  

  

posted @ 2019-06-17 20:00  清月无声  阅读(108)  评论(0)    收藏  举报