資料結構上機——希爾排序(含監視哨版本)
首先要明確一下什麼是監視哨
這個詞很容易望文生義
錯誤地認為是監視比較的值
查閱資料才發現
監視哨的意義是防止下標越界,提高速度
在插入排序中,
取用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分散式微服務架構原始碼資料結構排序
- 理解希爾排序排序
- Java希爾排序Java排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- 希爾排序(Shell Sort)排序
- C++希爾排序C++排序
- 希爾排序(C++)排序C++
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 希爾排序——重溫排序(二)排序
- 【資料結構與演算法】高階排序(希爾排序、歸併排序、快速排序)完整思路,並用程式碼封裝排序函式資料結構演算法排序封裝函式
- C#資料結構與演算法系列(二十一):希爾排序演算法(ShellSort)C#資料結構演算法排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 資料結構第九節(排序(上))資料結構排序
- PHP 排序演算法之希爾排序PHP排序演算法
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- JavaScript希爾排序簡單介紹JavaScript排序
- rust-algorithms:14-希爾排序RustGo排序
- 第二章 :查詢與排序-------希爾排序排序
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 資料結構與排序資料結構排序
- 【演算法】排序04——程式碼簡約而不簡單的希爾排序(含程式碼實現)演算法排序
- 【演算法】希爾排序的實現演算法排序
- python實現希爾排序演算法Python排序演算法
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 幾大排序總結(上)!圖解解析+程式碼例項(冒泡、選擇、插入、希爾、快排)排序圖解
- (戀上資料結構筆記):歸併排序(Merge Sort)資料結構筆記排序
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 資料結構32:選擇排序資料結構排序
- 資料結構之計數排序資料結構排序
- 資料結構第10章 排序資料結構排序