資料結構上機——希爾排序(含監視哨版本)

調包小王子發表於2020-12-17

首先要明確一下什麼是監視哨
這個詞很容易望文生義
錯誤地認為是監視比較的值
查閱資料才發現
監視哨的意義是防止下標越界,提高速度
在插入排序中,
取用r[0]作為監視哨,就可以在迴圈中減少一次判斷j>0的條件,從而提高速度
而在本題之中,採取五個監視哨的目的在於
希爾排序是跳躍的,最大的區間d[0]是5,所以只要防止j-5<0即可,不過還是存在bug!!
網上也找不到多監視哨的希爾排序,著實燒腦。
經過我半小時+的禿頭思考後,發現問題在於監視哨的key值,每個監視哨都必須初始化0,當然作為R[0]的監視哨還擔任儲存單元的雙重使命,也可以不初始化。
自此,程式順利完成

//希爾排序的程式程式碼
#include<stdio.h>
//順序表結構型別定義
typedef int datatype;
typedef struct{
	int key;
	datatype data;
}rectype;
const int N=10;
const int D1=5;

void create(rectype[],int);
void print(rectype[],int);
void shellsort(rectype[],int[]);

int main()
{
    rectype r[N+D1];//D1個元素存放監視哨,N個元素存放記錄
    int d[3]={5,3,1};//設定3趟的增量	
	create(r,N);//建立存放記錄的順序表
	printf("排序前的資料:");
	print(r,N);//輸出排序前的記錄表
	shellsort(r,d);//希爾排序
	printf("排序後的資料:");
	print(r,N);//輸出排序後的記錄表
}

//建立順序表
void create(rectype r[],int n)
{
	printf("輸入10個整型數:");
	for(int i=0;i<n;i++)
		scanf("%d",&r[D1+i].key);
}

//輸出順序表
void print(rectype r[],int n)
{
	for(int i=0;i<n;i++)
		printf("%5d",r[D1+i].key);
	printf("\n");
}

//新增希爾排序演算法
void shellsort(rectype r[],int d[])
{
	
	int i,j,k;
	//監視位置0
	for(i=0;i<D1;i++)
	{
		r[i].key=0;
	} 
	for(k=0;k<3;k++)
	{
		for(i=d[k]+1;i<=N;i++)
		{
			if(r[i+D1-1].key<r[i-d[k]+D1-1].key)
			{
				r[0].key=r[i+D1-1].key;
				j=i-d[k];
				while(r[0].key<r[j+D1-1].key)
				{
					r[j+d[k]+D1-1].key=r[j+D1-1].key;
					j=j-d[k];
				}
				r[j+d[k]+D1-1].key=r[0].key;
			}
		}
	}
}

相關文章