希爾排序圖解,簡單易懂


希爾排序是一種特殊的插入排序,是對直接插入排序的升級改進。所以在學習希爾排序之前,一定要先弄清楚直接插入排序算法。
基本思路:
設一個序列里有n個待排序的元素,將間隔相同距離的元素分為一組進行比較,這里的間隔稱之為增量,增量(gap)通常為n/2(奇數偶數都可以),隨着算法的進行增量慢慢縮小,直到相鄰的元素比較完,結束排序。
詳細步驟:
首先,列出一組待排序的元素組成一個數組(如圖1-1所示),數組長度len為8,增量gap可為4,2,1(每結束一輪排序,增量減半),首先增量為4時,將間隔相同距離的元素分為一組進行比較。

圖1-1

相同顏色的元素即為一組進行比較(如圖1-2所示)

圖1-2
第一組:8和6進行比較,8 > 6兩個元素交換位置(進行升序排序,小元素在前,大元素在后),如圖1-3所示:

圖1-3
第二組:1和2進行比較,1 < 2兩個元素位置不變
第三組:5和3進行比較,5 > 3兩個元素交換位置
第四組:4和7進行比較,4 < 7兩個元素位置不變
第一輪比較結束,結果如圖1-4所示:

圖1-4
接下來增量為2重新對數組進行分組排序,共分為兩組,如圖1-5所示:

圖1-5
第一組:6、3、8、5進行比較,小的元素在前,大的元素在后,結果為3、5、6、8。
第一組:1、4、2、7進行比較,小的元素在前,大的元素在后,結果為1、2、4、7。
第二輪比較結束,結果如圖1-6所示:

圖1-6
接下來繼續縮小增量,當增量為1時,就是直接插入排序,如果不太清楚的同學可以看看之前插入排序算法的文章,最后一輪排序結束后就可以得到一個完整的升序數組(如圖1-7所示)。

圖1-7
代碼實現:

#include <stdio.h>

void shellSort(int *a, int len) 
{
   int i, j, k, temp, gap;  // gap 為增量
   for (gap = len / 2; gap > 0; gap /= 2)   // 增量初始化為數組長度的一半,每次遍歷后增量減半
 {  
for (i = 0; i < gap; ++i)     // 變量 i 為每次分組的第一個元素下標 
{ 
 for (j = i + gap; j < len; j += gap) //對增量為gap的元素進行直插排序,當gap為1時,就是直插排序
{
                     temp = a[j];  // 備份a[j]的值
                     k = j - gap;  // j初始化為i的前一個元素(與i相差gap長度)
                     while (k >= 0 && a[k] > tmp) 
{
                          a[k + gap] = a[k]; // 將在a[i]前且比temp的值大的元素向后移動一位
                           k -= gap;
                     }
                       a[k + gap] = temp; 
                }
            }
        }
}

int main(  )
{
        int i;
        int a[8]={8,1,5,4,6,2,3,7};
        int len = 8;
        shellSort(a, len);        // 調用希爾排序函數
        printf("希爾升序排列后結果為:\n");
        for (i = 0; i < len; i++)
 {                   
            printf("%d\t",a[i]);      // 排序后的結果的輸出
        }
        printf("\n");

        return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM