排序算法 --- 希尔排序
1 原理
希爾排序可以看作是對(duì)直接插入排序的優(yōu)化. 直接插入是從前到后遍歷數(shù)組, 每一個(gè)元素都往前移動(dòng)到最合適的位置. 而希爾排序是利用間隔對(duì)數(shù)組進(jìn)行分組, 然后再對(duì)每個(gè)小組進(jìn)行子排序, 直到間隔為1.
2 具體步驟
首先要介紹一下間隔是什么.
間隔:?間隔是確定子分組的依據(jù), 間隔是多少, 就有多少個(gè)子分組, 例如:
數(shù)組為: 7,3,2,5,8,1,6,9,0,4, 如果此時(shí)間隔為3, 那么如果兩個(gè)數(shù)的間隔為三, 那么二者就為一組, 因?yàn)殚g隔多少就有多少組, 也就是說此時(shí)應(yīng)該有三組, 其索引是:
- 0, 3, 6, 9
- 1, 4, 7
- 2, 5, 8
對(duì)應(yīng)的元素為:
- 7, 5, 6, 4
- 3, 8, 9
- 2, 1, 0
了解了間隔之后, 下面就是希爾排序的具體步驟了(還是以上面的數(shù)組為例子).
1. 初始間隔為數(shù)組長度的一半(例子中數(shù)組長度為10, 初始間隔為5)
2. 把數(shù)組按照間隔進(jìn)行分組, 組數(shù)為間隔大小(例中此時(shí)間隔為5, 那也就是第0, 5 一組, 1,6一組, 2, 7一組, 3, 8一組, 4, 9一組)
3. 對(duì)每個(gè)小組進(jìn)行插入排序
4. 間隔除以2, 如果>0, 重復(fù)第二步.
代碼:
vector<int> sortArray(vector<int>& nums) {int n = nums.size();int gap = n / 2;while (gap) {for (int i = 0; i < gap; i ++) {for (int cur_i = i + gap; cur_i < n; cur_i += gap) {for (int ii = cur_i; ii >= gap && nums[ii] < nums[ii - gap]; ii -= gap) {swap(nums[ii], nums[ii - gap]);}}}gap /= 2;}return nums; }總結(jié)
以上是生活随笔為你收集整理的排序算法 --- 希尔排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab实验函数编写与程序设计,ma
- 下一篇: java窗口只能点一个_java – 为