数据结构之希尔排序图文详解及代码(C++实现)
生活随笔
收集整理的這篇文章主要介紹了
数据结构之希尔排序图文详解及代码(C++实现)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題:
對待排序的數(shù)組r[1..n]中的元素進行直接插入排序,得到一個有序的(從小到大)的數(shù)組r[1..n]。
算法思想:
1、第一趟取增量d1(d1<n)把全部記錄分為d1個組,所有間隔為d1的記錄分在同一組,在各個組中進行直接插入排序。
2、第二趟取增量d2(d2<d1),重復上述的分組和排序。
3、以此類推,直到所取的增量dt=1(dt<dt_1<d_t-2<......<d2<d1),所有記錄在同一組中進行直接插入排序為止。
圖解:
代碼:
#include<iostream> using namespace std; #define MAXSIZE 20//順序表的最大長度 typedef int KeyType;//定義關(guān)鍵字類型為整型 typedef int InfoType; typedef struct {KeyType key;//關(guān)鍵字項InfoType otherinfo;//其他數(shù)據(jù)項 }RedType; typedef struct {RedType r[MAXSIZE+1];//r[0]閑置或做哨兵單元int length;//順序表的長度 }SqList;//順序表類型void ShellInsert(SqList &L,int dk)//對順序表L做一趟增量是dk的希爾插入排序 {for(int i=dk+1;i<=L.length;i++)if(L.r[i].key<L.r[i-dk].key)//需將L.r[i]插入有序增量子表{int j;L.r[0]=L.r[i];//暫存在L.r[0]for(j=i-dk;j>0&&L.r[0].key<L.r[j].key;j-=dk)L.r[j+dk]=L.r[j];//記錄后移,直接找到插入位置L.r[j+dk]=L.r[0];//將r[0]即原r[i],插入到正確的位置}//if }void ShellSort(SqList &L,int dt[],int t)//按增量序列dt[0,t-1]對順序表L做t趟希爾排序 {for(int k=0;k<t;k++)ShellInsert(L,dt[k]); }int main() {SqList L;int dt[3]={5,3,1};for(int i=1;i<=10;i++)L.r[i].key=11-i;L.length=10;for(int i=1;i<=L.length;i++)cout<<L.r[i].key<<" ";cout<<endl;ShellSort(L,dt,3);for(int i=1;i<=L.length;i++)cout<<L.r[i].key<<" ";cout<<endl;return 0; }運行結(jié)果:
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的数据结构之希尔排序图文详解及代码(C++实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构之折半插入排序图文详解及代码(C
- 下一篇: 数据结构之快速排序图文详解及代码(C++