資料結構小學期第一天2

新晋软工小白發表於2024-07-01

實現希爾排序

本題要求實現一趟希爾排序函式,待排序列的長度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];
        }
    }
}

相關文章