1. 程式人生 > >資料結構與演算法 (九) 希爾排序

資料結構與演算法 (九) 希爾排序

演算法思想: 希爾排序是基於插入排序的以下兩點性質而提出改進方法的
先取一個小於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;
}