自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java排序算法總結(jié)(四):希爾排序

開發(fā) 后端 算法
希爾排序(Shell Sort)是插入排序的一種。是針對(duì)直接插入排序算法的改進(jìn)。該方法又稱縮小增量排序,因DL.Shell于1959年提出而得名。本文主要介紹希爾排序用Java是怎樣實(shí)現(xiàn)的。

希爾排序(縮小增量法) 屬于插入類排序,是將整個(gè)無(wú)序列分割成若干小的子序列分別進(jìn)行插入排序。希爾排序并不穩(wěn)定,O(1)的額外空間,時(shí)間復(fù)雜度為O(N*(logN)^2)。最壞的情況下的執(zhí)行效率和在平均情況下的執(zhí)行效率相比相差不多。

基本思想:

先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分成d1個(gè)組。所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?/p>

代碼實(shí)現(xiàn):

  1. public class Test {   
  2. public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 預(yù)設(shè)數(shù)據(jù)數(shù)組   
  3. public static void main(String args[]) {   
  4. int i; // 循環(huán)計(jì)數(shù)變量   
  5. int Index = a.length;// 數(shù)據(jù)索引變量   
  6. System.out.print("排序前: ");   
  7. for (i = 0; i &lt; Index - 1; i++)   
  8. System.out.printf("%3s ", a);   
  9. System.out.println("");   
  10. ShellSort(Index - 1); // 選擇排序   
  11. // 排序后結(jié)果   
  12. System.out.print("排序后: ");   
  13. for (i = 0; i &lt; Index - 1; i++)   
  14. System.out.printf("%3s ", a);   
  15. System.out.println("");   
  16. }   
  17. public static void ShellSort(int Index) {   
  18. int i, j, k; // 循環(huán)計(jì)數(shù)變量   
  19. int Temp; // 暫存變量   
  20. boolean Change; // 數(shù)據(jù)是否改變   
  21. int DataLength; // 分割集合的間隔長(zhǎng)度   
  22. int Pointer; // 進(jìn)行處理的位置   
  23. DataLength = (int) Index / 2; // 初始集合間隔長(zhǎng)度   
  24. while (DataLength != 0) // 數(shù)列仍可進(jìn)行分割   
  25. {   
  26. // 對(duì)各個(gè)集合進(jìn)行處理   
  27. for (j = DataLength; j &lt; Index; j++) {   
  28. Change = false;   
  29. Temp = a[j]; // 暫存Data[j]的值,待交換值時(shí)用   
  30. Pointer = j - DataLength; // 計(jì)算進(jìn)行處理的位置   
  31. // 進(jìn)行集合內(nèi)數(shù)值的比較與交換值   
  32. while (Temp &lt; a[Pointer] && Pointer >= 0 && Pointer &lt;= Index) {   
  33. a[Pointer + DataLength] = a[Pointer];   
  34. // 計(jì)算下一個(gè)欲進(jìn)行處理的位置   
  35. PointerPointer = Pointer - DataLength;   
  36. Change = true;   
  37. if (Pointer &lt; 0 || Pointer > Index)   
  38. break;   
  39. }   
  40. // 與最后的數(shù)值交換   
  41. a[Pointer + DataLength] = Temp;   
  42. if (Change) {   
  43. // 打印目前排序結(jié)果   
  44. System.out.print("排序中: ");   
  45. for (k = 0; k &lt; Index; k++)   
  46. System.out.printf("%3s ", a[k]);   
  47. System.out.println("");   
  48. }   
  49. }   
  50. DataLengthDataLength = DataLength / 2; // 計(jì)算下次分割的間隔長(zhǎng)度   
  51. }   
  52. }   

希爾排序幾乎沒有最壞情況,無(wú)論是正序、逆序、亂序,所用時(shí)間都不是很多,附加儲(chǔ)存是O(1),的確非常不錯(cuò)。在沒搞清楚快速排序、堆排序之前,它的確是個(gè)很好的選擇。希望能給你帶來(lái)幫助。

【編輯推薦】

  1. 何時(shí)創(chuàng)建Java對(duì)象實(shí)例
  2. 經(jīng)典四講貫通C++排序之二 希爾排序
  3. Java Web應(yīng)用開發(fā)中的一些概念解讀

 

責(zé)任編輯:于鐵 來(lái)源: 百度
相關(guān)推薦

2011-04-20 14:07:37

冒泡排序

2011-04-20 13:56:08

選擇排序

2022-03-12 20:12:08

希爾排序數(shù)組插入排序

2011-04-20 15:06:44

堆排序

2011-04-20 15:20:03

快速排序

2023-03-06 08:10:52

數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)

2023-10-07 00:11:37

希爾排序算法

2011-04-20 14:29:07

歸并排序

2011-04-20 12:49:44

插入排序

2011-04-20 16:05:15

基數(shù)排序

2011-04-11 14:21:43

希爾排序排序C++

2015-08-26 10:13:55

排序算法總結(jié)

2019-09-17 16:30:18

java排序算法

2021-01-26 05:33:07

排序算法快速

2015-09-01 10:21:53

排序算法總結(jié)

2023-10-05 09:01:05

插入排序對(duì)象序列log2i

2021-06-24 17:55:40

Python 開發(fā)編程語(yǔ)言

2022-01-06 16:20:04

Java排序算法排序

2021-10-15 09:43:12

希爾排序復(fù)雜度

2021-01-19 07:02:26

算法數(shù)據(jù)結(jié)構(gòu)堆排序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)