快速排序


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM