排序算法 --- 希尔排序
生活随笔
收集整理的這篇文章主要介紹了
排序算法 --- 希尔排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 原理
希爾排序可以看作是對直接插入排序的優化. 直接插入是從前到后遍歷數組, 每一個元素都往前移動到最合適的位置. 而希爾排序是利用間隔對數組進行分組, 然后再對每個小組進行子排序, 直到間隔為1.
2 具體步驟
首先要介紹一下間隔是什么.
間隔:?間隔是確定子分組的依據, 間隔是多少, 就有多少個子分組, 例如:
數組為: 7,3,2,5,8,1,6,9,0,4, 如果此時間隔為3, 那么如果兩個數的間隔為三, 那么二者就為一組, 因為間隔多少就有多少組, 也就是說此時應該有三組, 其索引是:
- 0, 3, 6, 9
- 1, 4, 7
- 2, 5, 8
對應的元素為:
- 7, 5, 6, 4
- 3, 8, 9
- 2, 1, 0
了解了間隔之后, 下面就是希爾排序的具體步驟了(還是以上面的數組為例子).
1. 初始間隔為數組長度的一半(例子中數組長度為10, 初始間隔為5)
2. 把數組按照間隔進行分組, 組數為間隔大小(例中此時間隔為5, 那也就是第0, 5 一組, 1,6一組, 2, 7一組, 3, 8一組, 4, 9一組)
3. 對每個小組進行插入排序
4. 間隔除以2, 如果>0, 重復第二步.
代碼:
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; }總結
以上是生活随笔為你收集整理的排序算法 --- 希尔排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab实验函数编写与程序设计,ma
- 下一篇: java窗口只能点一个_java – 为