亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

圖解排序算法之希爾排序Java實(shí)現(xiàn)

瀏覽:3日期:2022-08-09 17:32:23
目錄一、基本思想二、代碼實(shí)現(xiàn)三、總結(jié)一、基本思想

希爾排序是把記錄按下標(biāo)的一定增量分組,對(duì)每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來(lái)越多,當(dāng)增量減至1時(shí),整個(gè)文件恰被分成一組,算法便終止。

簡(jiǎn)單插入排序很循規(guī)蹈矩,不管數(shù)組分布是怎么樣的,依然一步一步的對(duì)元素進(jìn)行比較,移動(dòng),插入,比如[5,4,3,2,1,0]這種倒序序列,數(shù)組末端的0要回到首位置很是費(fèi)勁,比較和移動(dòng)元素均需n-1次。而希爾排序在數(shù)組中采用跳躍式分組的策略,通過(guò)某個(gè)增量將數(shù)組元素劃分為若干組,然后分組進(jìn)行插入排序,隨后逐步縮小增量,繼續(xù)按組進(jìn)行插入排序操作,直至增量為1。希爾排序通過(guò)這種策略使得整個(gè)數(shù)組在初始階段達(dá)到從宏觀上看基本有序,小的基本在前,大的基本在后。然后縮小增量,到增量為1時(shí),其實(shí)多數(shù)情況下只需微調(diào)即可,不會(huì)涉及過(guò)多的數(shù)據(jù)移動(dòng)。

我們來(lái)看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續(xù)以gap = gap/2的方式,這種增量選擇我們可以用一個(gè)序列來(lái)表示,{n/2,(n/2)/2...1},稱為增量序列。希爾排序的增量序列的選擇與證明是個(gè)數(shù)學(xué)難題,我們選擇的這個(gè)增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實(shí)這個(gè)增量序列不是最優(yōu)的。此處我們做示例使用希爾增量。

圖解排序算法之希爾排序Java實(shí)現(xiàn)

二、代碼實(shí)現(xiàn)

在希爾排序的理解時(shí),我們傾向于對(duì)于每一個(gè)分組,逐組進(jìn)行處理,但在代碼實(shí)現(xiàn)中,我們可以不用這么按部就班地處理完一組再調(diào)轉(zhuǎn)回來(lái)處理下一組(這樣還得加個(gè)for循環(huán)去處理分組)比如[5,4,3,2,1,0] ,首次增量設(shè)gap=length/2=3,則為3組[5,2] [4,1] [3,0],實(shí)現(xiàn)時(shí)不用循環(huán)按組處理,我們可以從第gap個(gè)元素開(kāi)始,逐個(gè)跨組處理。同時(shí),在插入數(shù)據(jù)時(shí),可以采用元素交換法尋找最終位置,也可以采用數(shù)組元素移動(dòng)法尋覓。希爾排序的代碼比較簡(jiǎn)單,如下:

package sortdemo;import java.util.Arrays;public class ShellSort { public static void main(String []args){int []arr ={1,4,2,7,9,8,3,6};sort(arr);System.out.println(Arrays.toString(arr));int []arr1 ={1,4,2,7,9,8,3,6};sort1(arr1);System.out.println(Arrays.toString(arr1)); } /** * 希爾排序 針對(duì)有序序列在插入時(shí)采用交換法 * @param arr */ public static void sort(int []arr){//增量gap,并逐步縮小增量 for(int gap=arr.length/2;gap>0;gap/=2){ //從第gap個(gè)元素,逐個(gè)對(duì)其所在組進(jìn)行直接插入排序操作 for(int i=gap;i<arr.length;i++){ int j = i; while(j-gap>=0 && arr[j]<arr[j-gap]){ //插入排序采用交換法 swap(arr,j,j-gap); j-=gap; } } } } /** * 希爾排序 針對(duì)有序序列在插入時(shí)采用移動(dòng)法。 * @param arr */ public static void sort1(int []arr){//增量gap,并逐步縮小增量for(int gap=arr.length/2;gap>0;gap/=2){ //從第gap個(gè)元素,逐個(gè)對(duì)其所在組進(jìn)行直接插入排序操作 for(int i=gap;i<arr.length;i++){int j = i;int temp = arr[j];if(arr[j]<arr[j-gap]){ while(j-gap>=0 && temp<arr[j-gap]){//移動(dòng)法arr[j] = arr[j-gap];j-=gap; } arr[j] = temp;} }} } /** * 交換數(shù)組元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){arr[a] = arr[a]+arr[b];arr[b] = arr[a]-arr[b];arr[a] = arr[a]-arr[b]; }}三、總結(jié)

本文介紹了希爾排序的基本思想及其代碼實(shí)現(xiàn),希爾排序中對(duì)于增量序列的選擇十分重要,直接影響到希爾排序的性能。我們上面選擇的增量序列{n/2,(n/2)/2...1}(希爾增量),其最壞時(shí)間復(fù)雜度依然為O(n2),一些經(jīng)過(guò)優(yōu)化的增量序列如Hibbard經(jīng)過(guò)復(fù)雜證明可使得最壞時(shí)間復(fù)雜度為O(n3/2)。希爾排序的介紹到此為止。

以上就是圖解排序算法之希爾排序Java實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于希爾排序 Java的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 免费看片aⅴ免费大片 | 国产 欧美 日产久久 | 欧美刺激午夜性久久久久久久 | 一级毛片在线全部免费播放 | 日韩一区二区超清视频 | 一二三区乱码一区二区三区码 | 国产一区二区三区手机在线观看 | 日本理论片中文在线观看2828 | 国产亚洲精品免费 | 亚洲精品久久久久综合网 | 91久久99热青草国产 | 久久久久女人精品毛片 | 小明明看看视频永久免费网 | jizzjizzjizz亚洲护士 | 黄色网在线免费观看 | a一级黄色 | 亚洲精品高清国产一久久 | 国产精品乳摇在线播放 | 在线小视频国产 | 久久久精品国产免费观看同学 | 91最新入口 | 亚洲精品97福利在线 | 国产视频网 | 97se狠狠狠狠狠亚洲综合网 | 国产色产综合色产在线观看视频 | 久久综合亚洲一区二区三区 | 亚洲视频色图 | 免费黄色小视频在线观看 | 国产成人综合欧美精品久久 | 在线观看国产 | 亚洲精品在线第一页 | 亚洲成人精品视频 | 韩国一大片a毛片女同 | 成人黄色影视 | 久久爱综合网 | 色香影视| 偷拍第一页 | 成人免费男女视频网站慢动作 | 2048亚洲精品国产 | 99re最新地址 | 不卡中文字幕在线观看 |