資料結構與演算法 (九) 希爾排序
阿新 • • 發佈:2018-12-27
演算法思想: 希爾排序是基於插入排序的以下兩點性質而提出改進方法的
先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量 =1( < …<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
一般的初次取序列的一半為增量,以後每次減半,直到增量為1。
實現程式碼:
sort.h
typedef int ElementType; struct forSort { ElementType key; }; typedef struct forSort ForSort; void InitForSort(ForSort *FS,int a) { FS->key=a; }
main.c
#include <stdio.h> #include <stdlib.h> #include "sort.h" //n 陣列A 的長度 s 增量 void ShellSort(ForSort A[],int n,int s) { int i,j,k; ForSort temp; //分組排序,初始增量為s 每迴圈一次增量減半 直到增量為0 時結束 for(k=s; k>0; k>>=1) { for(i=k; i<n; i++) { // printf("%d\n",i); temp =A[i]; j=i-k; while(j>=0 && temp.key<A[j].key) { A[j+k]=A[j]; j-=k; } A[j+k]=temp; } } } int main() { int i; int A[8]={28,13,72,85,39,41,6,20}; ShellSort(A,8,4); // for(i=0;i<8;i++){ // // printf("%d\n",A[i]); // } return 1; }