快速排序
快速排序(QuickSort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将需要排序的数据分成独立两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两组数据分别进行快速排序,这个排序过程可以递归进行,以此达到整个数据变成有序序列。
一、基本介绍
快速排序是实践中的一种快速的排序算法,在对 Java基本类型的排序中特别有用。它的平均运行时间是。该算法之所以特别快,主要是由于非常精练和高度优先的内部循环(递归)。它的最坏情形性能为,但进行简单修改就可以使该情形极难出现。下面描述最常见的快速排序的实现 “经典快速排序”。原理视频:链接
二、快速排序代码演示
首先理解快速排序的思想,继而根据思想编写代码即可。
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 }