資料結構上機——希爾排序(含監視哨版本)
首先要明確一下什麼是監視哨
這個詞很容易望文生義
錯誤地認為是監視比較的值
查閱資料才發現
監視哨的意義是防止下標越界,提高速度
在插入排序中,
取用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;
}
}
}
}
相關文章
- 【資料結構】希爾排序!!!資料結構排序
- 【資料結構】希爾排序資料結構排序
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- python演算法與資料結構-希爾排序(35)Python演算法資料結構排序
- 對資料結構和演算法的總結和思考(三)--希爾排序資料結構演算法排序
- 資料結構第九節(排序(上))資料結構排序
- SpringCloud大型企業分散式微服務雲架構原始碼之【資料結構】-排序-希爾排序SpringGCCloud分散式微服務架構原始碼資料結構排序
- 資料結構 快速排序 C Swift 極簡版本資料結構排序Swift
- 資料結構 桶排序 基數排序MSD c++ swift 版本資料結構排序C++Swift
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 排序演算法總結之希爾排序排序演算法
- 資料結構與排序資料結構排序
- 【資料結構】堆排序資料結構排序
- 【資料結構】快速排序資料結構排序
- 【資料結構與演算法】高階排序(希爾排序、歸併排序、快速排序)完整思路,並用程式碼封裝排序函式資料結構演算法排序封裝函式
- 【資料結構與演算法】內部排序之三:堆排序(含完整原始碼)資料結構演算法排序原始碼
- 希爾排序排序
- 複習資料結構:排序演算法(五)——快速排序的各種版本資料結構排序演算法
- 【資料結構】歸併排序!!!資料結構排序
- 【資料結構】選擇排序!!!資料結構排序
- 【資料結構】氣泡排序資料結構排序
- 【資料結構】選擇排序資料結構排序
- 【資料結構】歸併排序資料結構排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- C#資料結構與演算法系列(二十一):希爾排序演算法(ShellSort)C#資料結構演算法排序
- 資料結構之---C語言實現快速排序(多個版本)資料結構C語言排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- Java希爾排序Java排序
- 理解希爾排序排序
- java 希爾排序Java排序
- 【資料結構與演算法】內部排序之五:計數排序、基數排序和桶排序(含完整原始碼)資料結構演算法排序原始碼
- (戀上資料結構筆記):歸併排序(Merge Sort)資料結構筆記排序
- 資料結構第10章 排序資料結構排序
- 資料結構32:選擇排序資料結構排序
- 資料結構之計數排序資料結構排序
- 資料結構 堆排序 c Swift資料結構排序Swift
- 複習資料結構:排序(一)——插入排序資料結構排序