1、快速排序的簡單介紹
算法思想:基於分治的思想,是冒泡排序的改進型。首先在數組中選擇一個基准點(該基准點的選取可能影響快速排序的效率,后面講解選取的方法),然后分別從數組的兩端掃描數組,設兩個指示標志(low指向起始位置,high指向末尾),首先從后半部分開始,如果發現有元素比該基准點的值小,就交換low和high位置的值,然后從前半部分開始掃秒,發現有元素大於基准點的值,就交換low和high位置的值,如此往復循環,直到low>=high,然后把基准點的值放到high這個位置。一次排序就完成了。以后采用遞歸的方式分別對前半部分和后半部分排序,當前半部分和后半部分均有序時該數組就自然有序了。
2、快速排序算法的特點
- 快速排序的時間主要耗費在划分操作上,對長度為k的區間進行划分,共需k-1次關鍵字的比較;
- 最壞情況是每次划分選取的基准都是當前無序區中關鍵字最小(或最大)的記錄,划分的結果是基准左邊的子區間為空(或右邊的子區間為空),而划分所得的另一個非空的子區間中記錄數目,僅僅比划分前的無序區中記錄個數減少一個。時間復雜度為O(n*n);
- 在最好情況下,每次划分所取的基准都是當前無序區的"中值"記錄,划分的結果是基准的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:O(nlogn);
- 盡管快速排序的最壞時間為O(n*n),但就平均性能而言,它是基於關鍵字比較的內部排序算法中速度最快者,快速排序亦因此而得名。它的平均時間復雜度為O(nlogn)。
3、快速排序算法的代碼實現
1 package com.baozi.paixu; 2 3 import java.util.Arrays; 4 5 /** 6 * 快速排序:通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,則分別 7 * 對這兩部分繼續進行排序,直到整個序列有序。 8 * 9 * @author BaoZi 10 * @create 2019-05-15-18:15 11 */ 12 public class QuickSort { 13 public static void main(String[] args) { 14 final int MAX = 15; 15 int[] nums = new int[MAX]; 16 System.out.println("...............使用的是選擇排序算法..............."); 17 for (int i = 0; i < MAX; i++) { 18 nums[i] = (int) (Math.random() * 10 + 5); 19 } 20 System.out.println("排序之前的數組為..............."); 21 System.out.println(Arrays.toString(nums)); 22 System.out.println("排序之后的數組為..............."); 23 //使用選擇排序算法進行排序: 24 QuickSort sort = new QuickSort(); 25 sort.quickSort(nums, 0, nums.length - 1); 26 System.out.println(Arrays.toString(nums)); 27 } 28 29 public void quickSort(int[] nums, int low, int high) { 30 if (low < high) { 31 int middle = getMiddle(nums, low, high); 32 //對左子序列進行排序 33 quickSort(nums, low, middle - 1); 34 //對右子序列進行排序 35 quickSort(nums, middle + 1, high); 36 } 37 } 38 39 private int getMiddle(int[] nums, int low, int high) { 40 //當前數組的第一個元素作為中軸(基准) 41 int temp = nums[low]; 42 while (low < high) { 43 //這里temp <= nums[high]中等號的情況相當於數組中出現了兩個相等的數字,循環比較依然能夠繼續 44 while (low < high && temp <= nums[high]) { 45 high--; 46 } 47 nums[low] = nums[high]; 48 while (low < high && temp >= nums[low]) { 49 low++; 50 } 51 nums[high] = nums[low]; 52 } 53 nums[low] = temp; 54 return low; 55 } 56 }