1 定义
快速排序用到了分治思想,同样的还有归并排序。乍看起来快速排序和归并排序非常相似,都是将问题变小,先排序子串,最后合并。不同的是快速排序在划分子问题的时候经过多一步处理,将划分的两组数据划分为一大一小,这样在最后合并的时候就不必像归并排序那样再进行比较。但也正因为如此,划分的不定性使得快速排序的时间复杂度并不稳定。
快速排序的基本思想:通过一趟排序将待排序列分隔成独立的两部分,其中一部分记录的元素均比另一部分的元素小,则可分别对这两部分子序列继续进行排序,以 达到整个序列有序。
1.1 算法步骤
快速排序使用分治法策略来把一个序列分为较小和较大的 2 个子序列,然后递回地 排序两个子序列。
具体算法描述如下:
-
从序列中随机挑出一个元素,做为 “基准”( pivot );
-
重新排列序列,将所有比基准值小的元素摆放在基准前面,所有比基准值大的 摆在基准的后面(相同的数可以到任一边)。在这个操作结束之后,该基准就 处于数列的中间位置。这个称为分区(partition)操作;
-
递归地把小于基准值元素的子序列和大于基准值元素的子序列进行快速排序。
1.2 图解算法
1.3 代码实现
package pratice0814; import java.util.Arrays; public class QuickSort1 { public static void main(String[] args) { int[] arr = {6,1,2,7,9,3,4,5,10,8}; quickSort(arr,0,arr.length - 1); System.out.println(Arrays.toString(arr)); } public static void quickSort(int[] arr,int start,int end){ //递归的结束条件 if (start >= end){ return; } int base = arr[start]; //定义基准值 int left = start; int right = end; while(left < right){ while (left < right && arr[right] >= base){ right --; } //判断基准值和右边指针的关系 while(left < right && arr[left] <= base){ left ++; } //判断基准值和左边指针的关系 //交换值 int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } // 基准值的位置 arr[start] = arr[left]; arr[left] = base; // 对数组左边进行快排 quickSort(arr, start, left - 1); //对数组右边进行快排 quickSort(arr, left + 1, end); } }