Java 插入排序之希爾排序的實(shí)例
更新時(shí)間:2017年07月08日 14:58:38 投稿:lqh
這篇文章主要介紹了Java 插入排序之希爾排序的實(shí)例的相關(guān)資料,需要的朋友可以參考下
Java 插入排序之希爾排序的實(shí)例
Java代碼
/*希爾排序(Shell Sort)是插入排序的一種。其基本思想是:先取定一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分成d1 * 個(gè)組,所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中,在各個(gè)組中進(jìn)行插入排序;然后,取第二個(gè)增量d2<d1,重復(fù)上述的分組和排序, * 直至所取的增量dt=1(dt<dt-1<...<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂? * new int[]{8,5,1,7,9,4,6},開始分割集合的間隔長度為3的情況,[[6][3][0]比較排序后,[4]和[1]比較排序后,[5]和[2]比較排序后, * 分割集合的間隔長度為1,這時(shí)[1]和[0]比較排序后,[2][1][0]....,和直接插入排序一樣了。*/ public static void shellSort(int[] intArray) { System.out.print("將要排序的數(shù)組為: "); for(int k=0;k<intArray.length;k++) System.out.print(" "+intArray[k]+" "); System.out.println(); int arrayLength=intArray.length; int j,k;//循環(huán)變量 int temp;//暫存變量 boolean isChange;//數(shù)據(jù)是否改變 int dataLength;//分割集合的間隔長度 int pointer;//進(jìn)行處理的位置 dataLength=arrayLength/2;//初始集合間隔長度 while(dataLength!=0){//數(shù)列仍可進(jìn)行分割 //對各個(gè)集合進(jìn)行處理 for(j=dataLength;j<arrayLength;j++){ isChange=false; temp=intArray[j];//暫存,待交換值時(shí)用 pointer=j-dataLength;//計(jì)算進(jìn)行處理的位置 //進(jìn)行集合內(nèi)數(shù)值的比較與交換值 while(temp<intArray[pointer]&&pointer>=0&&pointer<arrayLength){ intArray[pointer+dataLength]=intArray[pointer]; //計(jì)算下一個(gè)欲進(jìn)行處理的位置 pointer=pointer-dataLength; isChange=true; System.out.print("every changing result: "); for(k=0;k<arrayLength;k++) System.out.print(" "+intArray[k]+" "); System.out.println(); if(pointer<0||pointer>arrayLength) break; } //與最后的數(shù)值交換 intArray[pointer+dataLength]=temp; if(isChange){ System.out.print("Current sorting result: "); for(k=0;k<arrayLength;k++) System.out.print(" "+intArray[k]+" "); System.out.println(); } } System.out.print("指定分割集合的間隔長度為"+dataLength+",對各個(gè)集合進(jìn)行處理后,Current sorting result: "); for(k=0;k<arrayLength;k++) System.out.print(" "+intArray[k]+" "); System.out.println(); dataLength=dataLength/2;//計(jì)算下次分割的間隔長度 } }
運(yùn)行后的結(jié)果為:
Java代碼
將要排序的數(shù)組為: 8 5 1 7 9 4 6 every changing result: 8 5 1 8 9 4 6 Current sorting result: 7 5 1 8 9 4 6 every changing result: 7 5 1 8 9 4 8 every changing result: 7 5 1 7 9 4 8 Current sorting result: 6 5 1 7 9 4 8 指定分割集合的間隔長度為3,對各個(gè)集合進(jìn)行處理后,Current sorting result: 6 5 1 7 9 4 8 every changing result: 6 6 1 7 9 4 8 Current sorting result: 5 6 1 7 9 4 8 every changing result: 5 6 6 7 9 4 8 every changing result: 5 5 6 7 9 4 8 Current sorting result: 1 5 6 7 9 4 8 every changing result: 1 5 6 7 9 9 8 every changing result: 1 5 6 7 7 9 8 every changing result: 1 5 6 6 7 9 8 every changing result: 1 5 5 6 7 9 8 Current sorting result: 1 4 5 6 7 9 8 every changing result: 1 4 5 6 7 9 9 Current sorting result: 1 4 5 6 7 8 9 指定分割集合的間隔長度為1,對各個(gè)集合進(jìn)行處理后,Current sorting result: 1 4 5 6 7 8 9
當(dāng)分割的間隔為1時(shí),變成了直接插入排序。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java實(shí)現(xiàn)post請求詳細(xì)代碼(帶有參數(shù))
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)帶有參數(shù)post請求的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-08-08java線程之Happens before規(guī)則案例詳解
這篇文章主要為大家介紹了java線程之Happens-before規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-08-08Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明
這篇文章主要介紹了Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信)
這篇文章主要介紹了java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10