快速排序

快速排序(QuickSort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将需要排序的数据分成独立两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两组数据分别进行快速排序,这个排序过程可以递归进行,以此达到整个数据变成有序序列。

一、基本介绍


快速排序是实践中的一种快速的排序算法,在对 Java基本类型的排序中特别有用。它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精练和高度优先的内部循环(递归)。它的最坏情形性能为O(N^2),但进行简单修改就可以使该情形极难出现。下面描述最常见的快速排序的实现 “经典快速排序”。原理视频:链接

二、快速排序代码演示


首先理解快速排序的思想,继而根据思想编写代码即可。

 1 /**
 2  * 快速排序:思想:先将最后一个元素获取出来,作为枢纽元(pivot),开始移动左右指针
 3  */
 4 public class QuickSort {
 5 
 6     public static void main(String[] args) {
 7         Integer[] a = {44,33,66,2,4,88,44,62,49,23,43,89,50};
 8         //Integer[] a = {44,44,44,44,44,44,44,44,44,44,44,44,50};
 9         new QuickSort().sort(a,0,a.length-1);
10         List<Integer> ints = Arrays.asList(a);
11         for(int i: ints){
12             System.out.printf(i + "   ");
13         }
14     }
15 
16     //传入目标数组,左索引和右索引
17     public void sort(Integer[] arr , int left, int right){
18         int l = left;
19         int r = right-1;
20 
21         //当 left < right 的情况下进行无限循环
22         while(left < right && l >= 0 && r >= 0 && l < right && r < right){
23 
24             //循环获取 l > 最后一个元素的数据
25             while(arr[l] < arr[right]){
26                l++;
27             }
28 
29             //循环获取 R < 最后一个元素的数据,这里添加等于是防止大量相同的元素的时候,r和l指针都不移动则会出现问题;
30             while(arr[r] >= arr[right] && r > 0){
31                 r--;
32             }
33 
34             //如果l 与 r 指针符合逻辑则交换彼此的数据
35             if(l < r){
36                 //交换数据
37                 swap(arr , l, r);
38              //如果两个相等,或者l > r 那么就说明比较结束,交换 l 与枢纽元 pivot
39             }else{
40                 swap(arr , l, right);
41                 //递归调用:对最左边的进行排序,l是当前的中间值
42                 //注意这里不要使用 --l 因为 --l 会改变l的值,举个例子,L=6时,--L后l=5 L-1 后 L=6 ,我们后面的 l+1需要初始的L值所以,不要使用 L--
43                 sort(arr , left, l-1);
44                 //递归调用:对最右边的进行排序,l是当前的中间值
45                 sort(arr , l+1,right);
46                 break;
47             }
48         }
49     }
50     //交换方法
51     public void swap(Integer[] arr ,int i,int j){
52         int temp = arr[i];
53         arr[i] = arr[j];
54         arr[j] = temp;
55     }
56 }
posted @ 2020-11-16 20:48  Java程序员进阶  阅读(109)  评论(0编辑  收藏  举报