希爾排序(Shell Sort)

2021-08-26 02:56:50 字數 990 閱讀 4739

#include

using

namespace

std;

/* 說明:

下面的內容全是按照公升序排序來寫的。

*//*

逆序對:

對於下標i < j,若arr[i] > arr[j],則稱arr[i]和arr[j]是乙個逆序對。

在排序過程中,最終的目的就是需要消除全部的逆序對。

簡單排序的弊端:

在簡單排序中,以交換相鄰的兩個元素的演算法每次都僅能消除乙個逆序對,

所以提公升排序效率的方法是每次交換兩個元素時能消除多個逆序對。

*//*

希爾排序:

希爾排序是插入排序的改進,插入排序每次僅交換相鄰的兩個元素。希爾

排序中多次呼叫插入排序,但排序的間隔不再是1,每趟排序交中進行交換

的是一定間隔的排序。使其能做到交換兩個元素時能消除多個逆序對。但

是最後一趟插入排序的間隔一定是1,也就是說最後一趟還是普通的插入排

序。這樣雖然是三重迴圈,但元素真正交換的次數小於簡單排序。由此希

爾排序中最重要的就是設定這種間隔,即增量序列的選擇,常用的有兩個排

序效率較高的增量序列:hibbard序列和sedgewick序列。

*//*

hibbard序列:

(1 << (++k)) - 1

*/vector

hibbardsequence(int n)

return seq;}/*

sedgewick序列:

i從1開始,j從2開始,

9*((1<<(i*2))-(1<(1<<(j*2))-3*(1 sedgewicksequence(int n)

return seq;

}void shellsort(int *arr, int len, vector

(*getseq)(int))

}}int main()

希爾排序(Shell Sort)

希爾排序 shell sort 又叫做縮小增量排序 diminishing increment sort 是一種很優秀的排序法,演算法本身不難理解,也很容易實現,而且它的速度很快。基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中...

希爾排序 shellsort

希爾排序 shellsort 又叫增量遞減 diminishing increment 排序,是由d.l.shell發明的,這個演算法是通過乙個逐漸減小的增量使乙個陣列逐漸趨近於有序從而達到排序的目的。假設有乙個陣列int data 16 首先將這個增量設為16 2 8,這樣就將這個陣列分成了8個子...

希爾排序(ShellSort)

希爾排序 shellsort cpp view plain copy include shellsort.h include print.h 希爾排序,分組進行插入排序,最後一步仍然是插入排序,但是因為之前的操作使逆序數減少,所以相對單純的插入排序效率高。void shellsort inta,in...