亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中常用的6種排序算法詳細分解

2019-11-26 15:28:21
字體:
來源:轉載
供稿:網友

排序算法很多地方都會用到,近期又重新看了一遍算法,并自己簡單地實現了一遍,特此記錄下來,為以后復習留點材料。

廢話不多說,下面逐一看看經典的排序算法:

1. 選擇排序

選擇排序的基本思想是遍歷數組的過程中,以 i 代表當前需要排序的序號,則需要在剩余的 [i…n-1] 中找出其中的最小值,然后將找到的最小值與 i 指向的值進行交換。因為每一趟確定元素的過程中都會有一個選擇最大值的子流程,所以人們形象地稱之為選擇排序。舉個實例來看看:

初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11] 
 
i = 0:  [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2]) 
 
i = 1:  [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17]) 
 
i = 2:  [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16]) 
 
i = 3:  [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 無需交換 ) 
 
i = 4:  [2, 7, 11, 16, 16 , 31, 39, 32, 38, 17 ] (4th [17]<->9th [16]) 
 
i = 5:  [2, 7, 11, 16, 16, 17 , 39, 32, 38, 31 ] (5th [31]<->9th [17]) 
 
i = 6:  [2, 7, 11, 16, 16, 17, 31 , 32, 38, 39 ] (6th [39]<->9th [31]) 
 
i = 7:  [2, 7, 11, 16, 16, 17, 31, 32, 38, 39] ( 無需交換 ) 
 
i = 8:  [2, 7, 11, 16, 16, 17, 31, 32, 38, 39] ( 無需交換 ) 
 
i = 9:  [2, 7, 11, 16, 16, 17, 31, 32, 38, 39] ( 無需交換 )

由例子可以看出,選擇排序隨著排序的進行( i 逐漸增大),比較的次數會越來越少,但是不論數組初始是否有序,選擇排序都會從 i 至數組末尾進行一次選擇比較,所以給定長度的數組,選擇排序的比較次數是固定的: 1 + 2 + 3 + …. + n = n * (n + 1) / 2 ,而交換的次數則跟初始數組的順序有關,如果初始數組順序為隨機,則在最壞情況下,數組元素將會交換 n 次,最好的情況下則可能 0 次(數組本身即為有序)。

由此可以推出,選擇排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1) (選擇排序只需要一個額外空間用于數組元素交換)。

實現代碼:

復制代碼 代碼如下:

/** 
* Selection Sorting 
*/
SELECTION(new Sortable() { 
    public <T extends Comparable<T>> void sort(T[] array, boolean ascend) { 
        int len = array.length; 
        for (int i = 0; i < len; i++) { 
            int selected = i; 
            for (int j = i + 1; j < len; j++) { 
                int compare = array[j].compareTo(array[selected]); 
                if (compare != 0 && compare < 0 == ascend) { 
                    selected = j; 
                } 
            } 
 
            exchange(array, i, selected); 
        } 
    } 
})

2. 插入排序

插入排序的基本思想是在遍歷數組的過程中,假設在序號 i 之前的元素即 [0..i-1] 都已經排好序,本趟需要找到 i 對應的元素 x 的正確位置 k ,并且在尋找這個位置 k 的過程中逐個將比較過的元素往后移一位,為元素 x “騰位置”,最后將 k 對應的元素值賦為 x ,插入排序也是根據排序的特性來命名的。

以下是一個實例,紅色 標記的數字為插入的數字,被劃掉的數字是未參與此次排序的元素,紅色 標記的數字與被劃掉數字之間的元素為逐個向后移動的元素,比如第二趟參與排序的元素為 [11, 31, 12] ,需要插入的元素為 12 ,但是 12 當前并沒有處于正確的位置,于是我們需要依次與前面的元素 31 、 11 做比較,一邊比較一邊移動比較過的元素,直到找到第一個比 12 小的元素 11 時停止比較,此時 31 對應的索引 1 則是 12 需要插入的位置。

初始:    [11, 31, 12, 5, 34, 30, 26, 38, 36, 18] 
 
第一趟: [11, 31 , 12, 5, 34, 30, 26, 38, 36, 18] (無移動的元素) 
 
第二趟: [11, 12 , 31, 5, 34, 30, 26, 38, 36, 18] ( 31 向后移動) 
 
第三趟: [5 , 11, 12, 31, 34, 30, 26, 38, 36, 18] ( 11, 12, 31 皆向后移動) 
 
第四趟: [5, 11, 12, 31, 34 , 30, 26, 38, 36, 18] (無移動的元素) 
 
第五趟: [5, 11, 12, 30 , 31, 34, 26, 38, 36, 18] ( 31, 34 向后移動) 
 
第六趟: [5, 11, 12, 26 , 30, 31, 34, 38, 36, 18] ( 30, 31, 34 向后移動) 
 
第七趟: [5, 11, 12, 26, 30, 31, 34, 38 , 36, 18] (無移動的元素) 
 
第八趟: [5, 11, 12, 26, 30, 31, 34, 36 , 38, 18] ( 38 向后移動) 
 
第九趟: [5, 11, 12, 18 , 26, 30, 31, 34, 36, 38] ( 26, 30, 31, 34, 36, 38 向后移動)

插入排序會優于選擇排序,理由是它在排序過程中能夠利用前部分數組元素已經排好序的一個優勢,有效地減少一些比較的次數,當然這種優勢得看數組的初始順序如何,最壞的情況下(給定的數組恰好為倒序)插入排序需要比較和移動的次數將會等于 1 + 2 + 3… + n = n * (n + 1) / 2 ,這種極端情況下,插入排序的效率甚至比選擇排序更差。因此插入排序是一個不穩定的排序方法,插入效率與數組初始順序息息相關。一般情況下,插入排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1) 。

實現代碼:

復制代碼 代碼如下:

/** 
* Insertion Sorting 
*/
INSERTION(new Sortable() { 
    public <T extends Comparable<T>> void sort(T[] array, boolean ascend) { 
        int len = array.length; 
        for (int i = 1; i < len; i++) { 
            T toInsert = array[i]; 
            int j = i; 
            for (; j > 0; j亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区av影院萌芽| 日韩电影在线观看永久视频免费网站| 97国产真实伦对白精彩视频8| 亚洲国产成人精品女人久久久| 国产97在线|日韩| 国产精品美女在线观看| 免费99精品国产自在在线| 欧美国产日韩在线| 大伊人狠狠躁夜夜躁av一区| 成人久久一区二区| 国内偷自视频区视频综合| 日本高清视频精品| 亚洲天堂av高清| 国产精品日韩在线播放| 亚洲女人初尝黑人巨大| 久久久精品2019中文字幕神马| 日韩精品久久久久久福利| 亚洲一区二区福利| 97成人精品区在线播放| 91色在线观看| 亚洲japanese制服美女| 欧美一级成年大片在线观看| 欧美黑人狂野猛交老妇| 午夜精品视频在线| 亚洲高清一二三区| 欧美在线一区二区视频| 日韩免费av一区二区| 日本久久久久久久久久久| 91国内揄拍国内精品对白| 国产成人av在线播放| 国内精品久久影院| 欧美在线亚洲在线| 97涩涩爰在线观看亚洲| 日韩精品欧美国产精品忘忧草| 中文字幕欧美精品在线| 亚洲人午夜精品免费| 欧美日韩国产中文精品字幕自在自线| 欧美精品videosex牲欧美| 国内精品小视频| 在线观看中文字幕亚洲| 国产精品欧美一区二区| 亚洲精品国产精品国产自| 久久久久久久激情视频| 秋霞成人午夜鲁丝一区二区三区| 日韩欧美视频一区二区三区| 欧美性开放视频| 在线成人中文字幕| 日韩一二三在线视频播| 日韩精品视频免费在线观看| 亚洲欧洲第一视频| 国产中文字幕亚洲| 自拍偷拍亚洲在线| 亚洲欧洲日产国产网站| 久久久久久网址| 日韩在线观看网站| 日韩亚洲综合在线| 性金发美女69hd大尺寸| 中文国产成人精品| 国产精品午夜国产小视频| 91在线网站视频| 国产一区二区日韩精品欧美精品| 国产精品∨欧美精品v日韩精品| 国产在线观看精品| 26uuu国产精品视频| 成人激情视频小说免费下载| 91爱爱小视频k| 久久伊人91精品综合网站| 亚洲精品电影网站| 久久91亚洲人成电影网站| 91免费视频网站| 国产精品成人久久久久| 欧美日韩国产成人| 日韩在线播放一区| 岛国av一区二区| 欧美精品久久久久久久| 日韩在线免费高清视频| 国产精品白嫩美女在线观看| 国产日韩在线看片| 92福利视频午夜1000合集在线观看| 欧美性videos高清精品| 色狠狠久久aa北条麻妃| 欧美高清视频一区二区| 日本a级片电影一区二区| 国产精品高清网站| 91av网站在线播放| 成人中文字幕在线观看| 亚洲毛片在线免费观看| 国产精品久久久久久久久久久久| 欧美午夜精品久久久久久浪潮| 国产精品视频一区二区高潮| 国产日韩av高清| 久久99视频免费| 久久国产精品久久久| 91精品国产综合久久久久久久久| 欧美亚州一区二区三区| 亚洲精品国产品国语在线| 欧美尤物巨大精品爽| 久久精品视频在线观看| 日韩中文字幕在线精品| 欧美电影免费观看网站| 亚洲福利在线视频| 国产成人精品一区二区在线| 成人a免费视频| 亚洲黄色在线观看| 日韩视频中文字幕| 91精品国产91久久久久福利| 国产欧美久久久久久| 国产剧情日韩欧美| 日本人成精品视频在线| 91精品国产91久久久久久不卡| 中文字幕综合一区| 成人高清视频观看www| 国产精品爽爽ⅴa在线观看| 亚洲国产精品美女| 亚洲精品电影久久久| 国产亚洲精品久久久优势| 自拍偷拍亚洲区| 91av成人在线| 欧美激情乱人伦| 国产日韩欧美在线观看| 久久精品中文字幕免费mv| 国产成人精品在线播放| 欧美巨乳在线观看| 国产成人综合精品在线| 成人黄色激情网| 国产精品永久免费视频| 96sao精品视频在线观看| 91地址最新发布| 国产精品青青在线观看爽香蕉| 成人免费视频在线观看超级碰| 国产精品欧美在线| 亚洲香蕉成视频在线观看| 日韩精品在线观看一区| xxxxx91麻豆| 欧美成人久久久| 日韩经典第一页| 91啪国产在线| 欧美日韩国产色视频| 欧美电影免费观看电视剧大全| 午夜精品福利在线观看| 在线观看视频亚洲| 国内精品久久久久久久| 欧美午夜视频一区二区| 91麻豆桃色免费看| 成人黄色在线播放| 亚洲免费福利视频| 亚洲精品电影网站| 日韩欧美中文免费| 97av视频在线| 欧美一级免费看| 欧美野外猛男的大粗鳮| 一区国产精品视频| 色婷婷av一区二区三区在线观看| 欧美视频第一页| 亚洲无限av看| 久久久国产视频91| 欧美多人乱p欧美4p久久| 久久综合网hezyo| 欧美黑人巨大精品一区二区| 久久久久久久久久久成人| 亚洲成人免费在线视频| 亚洲精品一区av在线播放| 爱福利视频一区| 色悠悠久久久久|