快速排序
快速排序
一、基本思想
快速排序是一种分治的算法,它的基本思想是通过一趟排序将待排序元素分割成独立的两部分,其中一部分元素均比另一部分元素小,则可分别对这两部分元素继续进行递归排序,以达到整个序列有序。
基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素
2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分元素值均比基准元素值小,另一部分元素值均比基准值大。
3)此时基准元素所处的位置是其排好序后应处于的位置。
4)然后分别对这两部分记录用同样的方法继续进行排序(递归),直到整个序列有序。
快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;
二、算法实现
public class QuickSort { /** * 快速排序-递归实现 */ public static void quickSort(int[] array, int left, int right) { if (left >= right) return; int pivot = array[left];// 枢纽。 定义基准值 int i = left; int j = right; while (i < j) { //在基准处后面部分,从后往前找到首个比基准值小的数 while (pivot <= array[j] && i < j) j--; //在基准处前面部分,从前往后找到首个比基准值大的数 while (pivot >= array[i] && i < j)// 从左往右找到首个比基准值大的数 i++; // 如果i<j,交换上面找到的两个数 if (i < j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } array[left] = array[i]; array[i] = pivot;// 调整新基准值位置 quickSort(array, left, i - 1);// 对左边的子数组进行递归 quickSort(array, i + 1, right);// 对右边的子数组进行递归 } public static void main(String[] args) { int[] array = { 7, 5, 3, 2, 9, 10, 8, 4, 6, 1 }; int low = 0; int high = array.length - 1; quickSort(array, low, high); for (int i : array) { System.out.print(i + " ");//1 2 3 4 5 6 7 8 9 10 } } }
三、算法复杂度
快速排序被认为是,在所有同数量级(O(nlogn))的排序方法中,其平均性能最好的。
在最坏情况下,快速排序退化为冒泡排序,其时间复杂度为O(n^2)。
不积跬步,无以至千里。不积小流,无以成江海!