ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
【0】README
0)希爾排序是基于插入排序的。將插入排序算法 內for循環中的所有 1 改為增量就可以。。bingo。。?插入排序源碼
1)本文旨在給出?希爾排序(縮小增量排序)之塞奇威克增量序列 的源碼實現;
2)為什么要求 塞奇威克增量序列? ?
reason1)要知道, 塞奇威克 提出了幾種增量序列,最壞運行時間為 O(N^4/3),平均運行時間為 O(N^7/6); 其提出的增量序列中的最好序列是 {1, 5, 19, 41, 109, ......},該序列中的項或者是 9*4^i - 9*2^i + 1 或者是 4^i ?- 3*2^i + 1;
reason2)基于塞奇威克增量序列的希爾排序(縮小增量排序) 要 快于 花費 O(NlogN) 的 堆排序;
3)本文末會給出 基于?塞奇威克增量序列?的?希爾排序源碼實現,希爾排序的基礎知識參見?
http://blog.csdn.net/pacosonswjtu/article/details/49660799
【1】下面給出求塞奇威克增量序列 的 分析和源碼實現
1)分析
2)源碼如下
#include <stdio.h> #include <math.h> // 對增量序列賦值 和 找出所需要的最大輪數. // 如 Rebort Sedgewick(羅伯特·塞奇威克) 提出的 increment = 9*4^i - 9*2^i +1 或 increment = 4^i - 3*2^i +1; // incrementSeq[] 起點從 0 開始. int incrementSeqFunc(int* incrementSeq, int length) { int i, startup1 =0 , startup2 = 2;for(i=0; i<length; i++){if(i%2==0){incrementSeq[i] = 9*pow(4, startup1) - 9*pow(2, startup1) +1;startup1++;}else{incrementSeq[i] = pow(4, startup2) - 3*pow(2, startup2) +1;startup2++;}if(incrementSeq[i] >= length){break;}}return i; // 排序輪數,每輪都使用(比上一輪)縮小的增量序列 }void printArray(int data[], int size) {int i;for(i = 0; i < size; i++)printf("%d ", data[i]);printf("\n"); } #include "p167_shell_sort.h"int main() { int incrementSeq[255]; int length = 600;int round;round = incrementSeqFunc(incrementSeq, length);printArray(incrementSeq, round); }
3)打印結果
【2】基于塞奇威克增量序列 的 希爾排序源碼
Attention)you can also checkout the source code from?https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter7/review/p167_shell_sort?
void shell_sort(int* array, int length) { int incrementSeq[255]; // 增量序列(startup == 0).int i, j, round=incrementSeqFunc(incrementSeq, length);int increment, temp;for(; round>=1; round--){increment = incrementSeq[round-1];for(i=1*increment; i<length; i+=increment) // 默認地,array[0*increment]有序,所以從1*increment開始.{temp = array[i]; // 第1個無序成員.for(j=i-increment; j>=0; j-=increment) // j 在有序部分進行滑動.{if(temp < array[j]){array[j+increment] = array[j];}else{break;}}array[j+increment] = temp;}} } #include "p167_shell_sort.h"int main() { int array[] = {100, 1000, 100, 10, 6, 2, 19, 25, 15, 55, 35, 5, 110, 120, 119};int length = 15; shell_sort(array, length);printArray(array, length); }
總結
以上是生活随笔為你收集整理的ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑如何分盘及删除与合并如何删除电脑分区
- 下一篇: ReviewForJob——堆排序