當前位置:
首頁 > 知識 > 希爾排序及代碼實現

希爾排序及代碼實現

前言:

最近在學習排序,學習到希爾排序的時候對代碼有一些感觸,首先講一下希爾排序是怎麼個排序過程,然後在把我能夠實現的從網上盪來的代碼貼一下,然而這不是完了,我和組長大人在討論一番後,發現這個盪來的代碼是有些小問題的,所以把問題也寫一下。

排序過程:

待排序數組:48, 37 ,64, 96, 75, 12, 26, 48, 54, 03

步驟一:選一個小於n(就是你的數組長度)的數字(比如選5),然後按照這個數來分組,即第一個和隔5個數之後的數字分為一組。在這個例子里:48和隔個5個數的12為一組,因為12後面不夠5個數了,所以這個分組就到這了。

分組情況:

希爾排序及代碼實現

步驟二:將第一開始的分組的數字以直接插入的方式,按照從小到大的排序(也可以按照從大到小來)

12,26,45,54,03,48,37,64,98,75

步驟三:由於第二部進行了排序,在這個基礎上,再一次選一個小於 d1的數字,d2,以這個數字分組,這次以d2=3舉例

因此,第二次的分組情況如下:

希爾排序及代碼實現

步驟四:將剛剛分完組的數字,進行組內排序,還是以直接插入排序,所以排序之後結果是下面的情況:

12,03,45,37,26,48,54,64,75

步驟五:這次還要選一個數字d3作為分組的標準,第一,二兩次分別用的5,3,這次用d3=1。也就是說這次可以直接整體用直接插入排序了。

希爾排序及代碼實現

步驟六:直接插入排序結果為:03,12,26,37,45,48,54,64,75

感想:這個排序很好理解的,我一步一步的說的也很明白(自認為),下面貼出來代碼,湊合著實現一下吧。

[csharp] view plain copy

  1. namespace

    希爾排序
  2. {
  3. public

    partial

    class

    Form1 : Form
  4. {
  5. public

    Form1()
  6. {
  7. InitializeComponent();
  8. }
  9. private

    void

    button1_Click(

    object

    sender, EventArgs e)
  10. {
  11. int

    i;
  12. int

    temp = 0;
  13. int

    [] Array = { 48, 37, 64, 96, 75, 12, 26, 33, 54, 03 };
  14. for

    (

    int

    gap = Array.Length / 3; gap > 0; gap--)//第一重循環,按照gap的大小進行分組
  15. {
  16. for

    (i = 0; i < gap; i++)//第二重循環,對所有分組進行排序
  17. {
  18. for

    (

    int

    j = i; j < Array.Length; j = j + gap)//第三重循環,組內進行直接插入排序
  19. {
  20. temp = Array[j];
  21. int

    index = j - gap;
  22. while

    (index >= 0 && Array[index] > temp)
  23. {
  24. Array[index + gap] = Array[index];
  25. index = index - gap;
  26. }
  27. Array[index + gap] = temp;
  28. }
  29. }
  30. label2.Text = label2.Text + "
    " + "第" + i + "次結果";
  31. for

    (

    int

    k = 0;k <Array .Length ;k ++)
  32. {
  33. label2.Text = label2.Text + " " + Array[k];
  34. }
  35. }
  36. }
  37. }
  38. }

希爾排序及代碼實現

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

大眾點評點餐小程序開發經驗之發布與推廣
遞歸函數及匿名函數配合內置函數的使用

TAG:程序員小新人學習 |