【筆記】希爾排序
插入排序:將待排序元素分為已排序子集和未排序子集,一次從未排序子集中的一個元素插入已排序子集中,使已排序自己仍然有序;重複執行以上過程,指導所有元素都有序為止。
希爾排序又稱為縮小增量排序,它也是一種屬插入排序類的方法,但在事件效率上較前述集中排序方法都有較大的改進。
從對直接插入排序的分析得知,其演算法時間複雜度為
O(n^2)
,但是若待排記錄序列為“正序”時,其時間複雜度可提高至O(n)
。由此可設想,若待排記錄序列按關鍵字基本有序,即序列中具有下列特性L.data[i].key<max_{1 \leq j < i} \{L.data.key\}
的記錄較少時,直接插入排序的效率就可大大提高,從另一方面來看,由於直接插入排序的演算法簡單,則在n值很小時效率也比較高。希爾排序正是從這兩點分析出發對直接插入排序進行改進得到的一種排序方法。
基本演算法思想:先將整個待排記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。
從上述排序過程可見,希爾排序的一個特點是:子序列的構成不是簡單地逐段分割,而是將相隔某個增量的記錄組成一個子序列。如上圖中,第一趟排序時的增量為5,第二趟排序時的增量為3,由於在前兩趟的插入排序中記錄的關鍵字是和同一子序列中的前一個記錄的關鍵字進行比較,因此關鍵字較小的記錄就不是一步一步地往前挪動,而是跳躍式地往前移,從而使得在進行最後一趟增量為1的插入排序時,序列已基本有序,只要作記錄的少量比較和移動即可完成排序,因此希爾排序的時間複雜度較直接插入排序低。
- 型別定義
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef int KeyType;
typedef struct /*資料元素型別定義*/
{
KeyType key;/*關鍵字*/
}DataType;
typedef struct /*順序表型別定義*/
{
DataType data[MaxSize];
int length;
}SqList;
- 希爾排序函式
void ShellInsert(SqList *L,int c)
/*對順序表L進行一次希爾排序,c是增量*/
{
int i,j;
DataType t;
for(i=c+1;i<=L->length;i++) /*將距離為c的元素作為一個子序列進行排序*/
{
if(L->data[i].key<L->data[i-c].key) /*如果後者小於前者,則需要移動元素*/
{
t=L->data[i];
for(j=i-c;j>0&&t.key<L->data[j].key;j=j-c)
L->data[j+c]=L->data[j];
L->data[j+c]=t; /*依次將元素插入到正確的位置*/
}
}
}
void ShellInsertSort(SqList *L,int delta[],int m)
/*希爾排序,每次呼叫演算法ShellInsert,delta是存放增量的陣列*/
{
int i;
for(i=0;i<m;i++) /*進行m次希爾插入排序*/
{
ShellInsert(L,delta[i]);
}
}
- 主函式
void InitSeqList(SqList *L,DataType a[],int n)
/*順序表的初始化*/
{
int i;
for(i=1;i<=n;i++)
{
L->data[i]=a[i-1];
}
L->length=n;
}
void DispList(SqList L,int n)
/*順序表的輸出*/
{
int i;
for(i=1;i<=n;i++)
printf("%4d",L.data[i].key);
printf("\n");
}
void main()
{
DataType a[]={78,29,45,10,80,21,55,3,60,32};
int delta[]={5,3,1};
int n=10,m=3;
SqList L;
InitSeqList(&L,a,n);
printf("[排序前] ");
DispList(L,n);
ShellInsertSort(&L,delta,m);
printf("[希爾排序結果] ");
DispList(L,n);
}
- 測試結果
相關文章
- 希爾排序排序
- 理解希爾排序排序
- Java希爾排序Java排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- 希爾排序(Shell Sort)排序
- C++希爾排序C++排序
- 希爾排序(C++)排序C++
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 希爾排序——重溫排序(二)排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- PHP 排序演算法之希爾排序PHP排序演算法
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- JavaScript希爾排序簡單介紹JavaScript排序
- rust-algorithms:14-希爾排序RustGo排序
- 第二章 :查詢與排序-------希爾排序排序
- 【演算法】希爾排序的實現演算法排序
- python實現希爾排序演算法Python排序演算法
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 程式猿修仙之路--演算法之希爾排序演算法排序
- 【譯】Swift演算法俱樂部-希爾排序Swift演算法排序
- 基礎演算法系列 之希爾排序演算法排序
- python演算法與資料結構-希爾排序(35)Python演算法資料結構排序
- 【小小前端】前端排序演算法第二期(繞人的希爾排序)前端排序演算法
- 淺解前端必須掌握的演算法(四):希爾排序前端演算法排序
- 資料結構上機——希爾排序(含監視哨版本)資料結構排序
- 五分鐘學會一個高難度演算法:希爾排序演算法排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- (建議收藏)2020最新排序演算法總結:冒泡、選擇、插入、希爾、快速、歸併、堆排序、基數排序排序演算法
- 【資料結構與演算法】高階排序(希爾排序、歸併排序、快速排序)完整思路,並用程式碼封裝排序函式資料結構演算法排序封裝函式
- 【演算法】排序04——程式碼簡約而不簡單的希爾排序(含程式碼實現)演算法排序
- SpringCloud大型企業分散式微服務雲架構原始碼之【資料結構】-排序-希爾排序SpringGCCloud分散式微服務架構原始碼資料結構排序
- 希爾密碼(hill密碼)密碼
- Python 一網打盡<排序演算法>之從希爾排序演算法的分治哲學開始Python排序演算法