希尔排序

#include <iostream>
using namespace std;

/**
 * 希尔排序
 * 希尔排序是插入排序的的改进
 * 改进的主要思想是:
 *              1.插入排序对于小规模数组效率较高
 *              2.插入排序对于部分有序数组排序效率高
 * 希尔排序的性能取决于递增序列,和h有关。
 * 希尔排序也可适用于大数组,希尔排序要比选择排序和插入排序快得多,数组越大,优势越大。
 * 最坏的情况下,希尔排序的比较时间和N^(3/2)成正比
 * TIPS:
 *  使用该Demo中的递增序列的比较次数不会超过size的若干倍乘以递增序列的长度。
 * @param a
 * @param size
 * @return
 */
int shellInsertion(int a[],int size){
    int h = 1; //h有序
    //使用序列(3^k-1)/2,称之为递增序列。
    while(h < size/3) h = h*3 + 1;
    while(h>=1){
        for(int i = h;i < size;i++){
            for(int j = i;j >= h && (a[j] < a[j-h]);j-=h){
                int temp = a[j];
                a[j] = a[j-h];
                a[j-h] = temp;
            }
        }
        h = h/3;
    }
}
int main() {
    int a[] = {99,90,78,56,45,34,23,11,1};
    shellInsertion(a,sizeof(a)/sizeof(a[0]));
    for(int i = 0;i < sizeof(a)/sizeof(a[0]);i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

posted @ 2023-02-05 18:09  破忒头头  阅读(31)  评论(0)    收藏  举报