快速排序
基本思想:
通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。
算法分析:
时间复杂度:O(nlgn)(平均),O(nlgn)(最好),O(n^2)(最坏)
空间复杂度:O(nlgn)
稳定性:不稳定
Java实现:
1 import java.util.Arrays; 2 3 public class QuickSort { 4 5 public static int partition(int[] num, int low, int high) { 6 if(num == null || low < 0 || high >= num.length) { 7 return -1; 8 } 9 int pivotkey = num[low]; 10 //枢轴选定后永远不变,最终在中间,前小后大 11 while(low < high) { 12 while(low < high && num[high] > pivotkey) high--; 13 //将比枢轴小的元素移到低端,此时high位相当于空,等待低位比pivotkey大的数补上 14 num[low] = num[high]; 15 while(low < high && num[low] < pivotkey) low++; 16 //将比枢轴大的元素移到高端,此时low位相当于空,等待高位比pivotkey小的数补上 17 num[high] = num[low]; 18 } 19 //当low == high,完成一趟快速排序,此时low位相当于空,等待pivotkey补上 20 num[low] = pivotkey; 21 return low; 22 } 23 24 public static void quickSort(int[] num, int low, int high) { 25 if(low == high) { 26 return; 27 } 28 int pivot; 29 if(low < high) { 30 //pivot作为枢轴,较之小的元素在低位,较之大的元素在高位 31 pivot = partition(num, low, high); 32 //对前后数组递归调用快速排序,直到顺序完全正确 33 quickSort(num, low, pivot - 1); 34 quickSort(num, pivot + 1, high); 35 } 36 } 37 public static void main(String[] args) { 38 int[] array = {49,38,65,97,76,13,27}; 39 quickSort(array, 0, array.length - 1); 40 System.out.println(Arrays.toString(array)); 41 } 42 }