色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

瀏覽:14日期: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)文章:
主站蜘蛛池模板: 国产在线观看午夜不卡 | 国产黄色小视频 | 成年女人免费视频 | 韩国美女一级片 | 大片刺激免费播放视频 | 欧美一区二区三区播放 | 欧美成人亚洲 | 在线日韩国产 | 国产偷国产偷亚洲高清在线 | 国产美女做爰免费视频网址 | 日本乱理伦中文三区 | 久久精品国产亚洲7777小说 | 特级毛片a级毛免费播放 | 99久久九九 | 中国老太性色xxxxxhd | 久久久久久久久久久久福利 | 国产黄色自拍 | 91久久亚洲最新一本 | 成人a毛片手机免费播放 | 特黄毛片 | 国产成年网站v片在线观看 国产成人aa在线视频 | 欧美日本韩国一区二区 | 99精品福利视频在线一区 | 欧美在线视频一区二区 | 91视频一区| 久热久草 | 国产精品制服 | 2022麻豆福利午夜久久 | 精品国产午夜肉伦伦影院 | 99国产福利视频在线观看 | 九九精品视频在线播放 | 久热色| 波多野结衣中文在线播放 | 国产一区二区三区不卡在线观看 | 深夜福利视频在线看免费 | 一级毛片免费在线播放 | 国产毛片久久久久久国产毛片 | 精品视频一区二区三三区四区 | 日本特一级毛片免费视频 | 亚洲品质自拍视频 | 草草影院ccyy免费看片 |