成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

快速排序算法實現及優化

開發 前端 算法
快速排序可以說是使用最廣的排序算法了,主要的特點是基于原地排序(不需要使用輔助數組,節省空間);其實對于長度為N的數組使用快速排序時間復雜度為 NlogN;在前幾篇也一起討論了其他的排序算法,都沒能夠把這兩個特點結合起來。

[[385051]]

本文轉載自微信公眾號「貝塔學JAVA」,作者Silently9527。轉載本文請聯系貝塔學JAVA公眾號。

本文已被Github倉庫收錄 https://github.com/silently9527/JavaCore

程序員常用的IDEA插件:https://github.com/silently9527/ToolsetIdeaPlugin

完全開源的淘客項目:https://github.com/silently9527/mall-coupons-server

前言

快速排序可以說是使用最廣的排序算法了,主要的特點是基于原地排序(不需要使用輔助數組,節省空間);其實對于長度為N的數組使用快速排序時間復雜度為 NlogN;在前幾篇也一起討論了其他的排序算法,都沒能夠把這兩個特點結合起來。

快速排序思路

快速排序也是一種分治的排序算法,把數組劃分為兩個子數組,然后遞歸對子數組進行排序,最終保證整個數組有序。

算法思路:

  1. 隨機選擇一個切分元素,通常選擇的是數組的第一個元素
  2. 從數組的左邊開始掃描找出大于等于切分元素的值,從數組的右邊開始掃描找出小于等于切分元素的值,交換這兩個值
  3. 循環這個過程直到左右兩個指針相遇,這樣就排定了一個元素,保證了切分元素左邊的值都是小于它的值,右邊的元素都是大于它的值
  4. 遞歸這個過程,最終保證整個數組有序

算法實現

根據快速排序算法的思路,我們可以寫出第一版實現:

  1. public class QuickSort implements SortTemplate { 
  2.     @Override 
  3.     public void sort(Comparable[] array) { 
  4.         quickSort(array, 0, array.length - 1); 
  5.     } 
  6.  
  7.     private void quickSort(Comparable[] array, int lo, int hi) { 
  8.         if (lo >= hi) { 
  9.             return
  10.         } 
  11.         int partition = partition(array, lo, hi); 
  12.         quickSort(array, lo, partition - 1); 
  13.         quickSort(array, partition + 1, hi); 
  14.     } 
  15.  
  16.     private int partition(Comparable[] array, int lo, int hi) { 
  17.         int i = lo, j = hi + 1; 
  18.         Comparable el = array[lo]; 
  19.         while (true) { 
  20.             while (less(array[++i], el)) { 
  21.                 if (i == hi) { 
  22.                     break; 
  23.                 } 
  24.             } 
  25.             while (less(el, array[--j])) { 
  26.                 if (j == lo) { 
  27.                     break; 
  28.                 } 
  29.             } 
  30.             if (i >= j) { 
  31.                 break; 
  32.             } 
  33.             exch(array, i, j); 
  34.         } 
  35.         exch(array, lo, j); 
  36.         return j; 
  37.     } 

這段代碼是實現快速排序的常規實現,考慮最糟糕的情況,假如需要排序的數組是已經有序的[1,2,3,4,5,6,7,8],執行快速排序的過程如圖:

對一個長度為N的數組,最糟糕的情況下需要遞歸N-1次,所以時間復雜度是O(n2),為了避免這種情況出現,我們來看下算法如何改進

算法改進

  • 保證隨機性 為了避免最糟糕的情況出現,有兩個辦法,第一是在排序數組之前先隨機打亂數組;第二是在partition方法中隨機取切分元素,而不是固定取第一個,簡單實現:
  1. private int partition(Comparable[] array, int lo, int hi) { 
  2.     int i = lo, j = hi + 1; 
  3.     int random = new Random().nextInt(hi - lo) + lo; 
  4.     exch(array, lo, random); 
  5.     Comparable el = array[lo]; 
  6.     while (true) { 
  7.         while (less(array[++i], el)) { 
  8.             if (i == hi) { 
  9.                 break; 
  10.             } 
  11.         } 
  12.         while (less(el, array[--j])) { 
  13.             if (j == lo) { 
  14.                 break; 
  15.             } 
  16.         } 
  17.         if (i >= j) { 
  18.             break; 
  19.         } 
  20.         exch(array, i, j); 
  21.     } 
  22.     exch(array, lo, j); 
  23.     return j; 
  • 切換到插入排序 這點和歸并排序一樣,對于小數組的排序直接切換成插入排序
  1. private void quickSort(Comparable[] array, int lo, int hi) { 
  2.     if (lo >= hi) { 
  3.         return
  4.     } 
  5.      
  6.     if (hi - lo < 5) {  //測試,小于5就切換到插入排序 
  7.         insertionSort(array, lo, hi); 
  8.         return
  9.     } 
  10.  
  11.     int partition = partition(array, lo, hi); 
  12.     quickSort(array, lo, partition - 1); 
  13.     quickSort(array, partition + 1, hi); 
  14.  
  15. //插入排序 
  16. private void insertionSort(Comparable[] array, int lo, int hi) { 
  17.     for (int i = lo; i <= hi; i++) { 
  18.         for (int j = i; j > lo && less(array[j], array[j - 1]); j--) { 
  19.             exch(array, j, j - 1); 
  20.         } 
  21.     } 

三向切分 當我們需要排序的數組中出現了大量的重復元素,我們實現的快速排序在遞歸的時候會遇到許多全部重復的子數組,我們的算法依然會對其進行切分,這里有很大的提升空間。

思路就是先隨意選擇一個切分元素(el),然后把數組切換成大于、等于、小于三個部分,一次遞歸可以排定所有等于切分元素的值;維護一個指針lt、gt,使得a[lo..lt-1]都小于切分元素,a[gt+1..hi]都大于切分元素;

  • 初始化變量:lt=lo, i=lo+1, gt=hi
  • if a[i] < el ; 交換a[i]與a[lt], i++, lt++
  • if a[i] > el ; 交換a[gt]與a[i], gt--
  • a[i] == el; i++

代碼實現:

  1. public class Quick3waySort implements SortTemplate { 
  2.     @Override 
  3.     public void sort(Comparable[] array) { 
  4.         quickSort(array, 0, array.length - 1); 
  5.     } 
  6.  
  7.     @SuppressWarnings("unchecked"
  8.     private void quickSort(Comparable[] array, int lo, int hi) { 
  9.         if (lo >= hi) { 
  10.             return
  11.         } 
  12.         int lt = lo, i = lo + 1, gt = hi; 
  13.         Comparable el = array[lo]; 
  14.         while (i <= gt) { 
  15.             int tmp = el.compareTo(array[i]); 
  16.             if (tmp > 0) { 
  17.                 exch(array, lt++, i++); 
  18.             } else if (tmp < 0) { 
  19.                 exch(array, i, gt--); 
  20.             } else { 
  21.                 i++; 
  22.             } 
  23.         } 
  24.         quickSort(array, lo, lt - 1); 
  25.         quickSort(array, gt + 1, hi); 
  26.     } 

 

責任編輯:武曉燕 來源: 貝塔學JAVA
相關推薦

2023-05-08 07:55:05

快速排序Go 語言

2011-04-20 15:20:03

快速排序

2022-03-07 09:42:21

Go快速排序

2014-10-30 15:14:54

快速排序編程算法

2024-08-30 14:34:00

2014-10-30 15:08:21

快速排序編程算法

2023-03-07 08:02:07

數據結構算法數列

2014-03-03 16:44:57

算法

2009-08-13 10:35:05

Scala數組排序

2011-05-25 11:25:23

快速排序Javascript

2023-10-07 00:11:37

希爾排序算法

2009-11-17 11:06:37

PHP排序

2022-05-17 12:23:25

排序算法面試

2021-01-26 05:33:07

排序算法快速

2021-03-23 15:35:36

Adam優化語言

2021-07-16 04:57:45

Go算法結構

2009-08-19 09:42:34

F#并行排序算法

2022-11-01 18:29:25

Go語言排序算法

2022-03-10 06:36:59

分布式數據庫排序

2010-06-04 10:48:15

Hadoop性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合色在线 | 金莲网 | 久久亚洲欧美日韩精品专区 | 国产无套一区二区三区久久 | 国产精品91久久久久久 | 九九热在线视频 | 精品婷婷 | 一级片免费网站 | 亚洲一区精品视频 | 日韩中文在线视频 | 福利视频日韩 | 欧美5区 | 日韩网站免费观看 | 97超在线视频 | 亚洲 欧美 另类 综合 偷拍 | 亚洲午夜精品视频 | 精品无码久久久久国产 | 色毛片 | 亚洲风情在线观看 | 国产三级国产精品 | 亚洲一二三区免费 | 欧美二区在线 | 自拍偷拍第1页 | 99精品国产一区二区青青牛奶 | 奇米影视在线 | 亚洲网站在线观看 | www.久| 色欧美综合| www免费视频| 亚洲精品国产偷自在线观看 | 日韩欧美一区在线 | 国产婷婷色综合av蜜臀av | 国外成人在线视频 | 日韩欧美久久 | 欧美aa在线 | 天天爱天天操 | 国产乱码精品1区2区3区 | 国产精品亚洲成在人线 | 欧美另类视频在线 | 久久久www成人免费精品张筱雨 | 视频二区在线观看 |