實現希爾排序
本題要求實現一趟希爾排序函式,待排序列的長度1<=n<=1000。
函式介面定義:
void ShellInsert(SqList L,int dk);
其中L是待排序表,使排序後的資料從小到大排列。
###型別定義:
typedef int KeyType;
typedef struct {
KeyType *elem; /*elem[0]一般作哨兵或緩衝區*/
int Length;
}SqList;
裁判測試程式樣例:
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef struct {
KeyType *elem; /*elem[0]一般作哨兵或緩衝區*/
int Length;
}SqList;
void CreatSqList(SqList *L);/*待排序列建立,由裁判實現,細節不表*/
void ShellInsert(SqList L,int dk);
void ShellSort(SqList L);
int main()
{
SqList L;
int i;
CreatSqList(&L);
ShellSort(L);
for(i=1;i<=L.Length;i++)
{
printf("%d ",L.elem[i]);
}
return 0;
}
void ShellSort(SqList L)
{
/*按增量序列dlta[0…t-1]對順序表L作Shell排序,假設規定增量序列為5,3,1*/
int k;
int dlta[3]={5,3,1};
int t=3;
for(k=0;k<t;++k)
ShellInsert(L,dlta[k]);
}
/*你的程式碼將被嵌在這裡 */
輸入樣例:
第一行整數表示參與排序的關鍵字個數。第二行是關鍵字值 例如:
10
5 2 4 1 8 9 10 12 3 6
輸出樣例:
輸出由小到大的有序序列,每一個關鍵字之間由空格隔開,最後一個關鍵字後有一個空格。
1 2 3 4 5 6 8 9 10 12
void ShellInsert(SqList L ,int dk){ //從dk+1個元素開始,對每一個元素進行插入排序 for(int i=1+dk;i<=L.Length;++i){ //如果當前元素小於它前面dk個位置的元素,則需要進行插入操作 if(L.elem[i]<L.elem[i-dk]){ //將當前元素暫存到L.elem【0】中,這是一個哨兵位置 L.elem[0]=L.elem[i]; //從當前元素的前dk個位置開始比較,如果前dk個位置的元素大於 //當前元素,則需要向後移動 int x=i-dk; //當L.elem【x】大於暫存的元素且x大於0時,繼續向前查詢需要移動的元素 for(;L.elem[x] >L.elem[0] && x>0 ;x-=dk){ //當L.elem【x】向後移動dk個位置 L.elem[x+dk] = L.elem[x]; } //將暫存的元素放在正確的位置 L.elem[x+dk]=L.elem[0]; } } }