希尔排序(ShellSort)

来源:互联网 发布:java urlencoder 空格 编辑:程序博客网 时间:2024/06/06 06:49
//希尔排序:缩小增量排序//关键:增量序列的选择。不同的序列会影响算法的最坏运行时间//shell增量:ht=N/2(取下届),下届为(N^2)//Hibbard增量:1,3,7,...2^k-1,最坏运行时间下届为(N^3/2)//对于增量hk,所有相隔hk的元素都被排序//编程简单,运行时间分析复杂//本例使用shell增量#include <iostream>using namespace std;void ShellSort(int*a, int N);void ShellSort(int*a, int N){    int i, j, Increment, tmp;    int k=0;//定义变量k用来查看每次Increment,可以发现增量递减,最后都可以到达1    for(Increment = N/2; Increment > 0; Increment/=2){        k++;        cout<<Increment<<' '<<k<<endl;        for(i = Increment; i < N; i++){            tmp = a[i];            for(j = i; j >= Increment; j -= Increment){                if(tmp < a[j-Increment])                    a[j] = a[j-Increment];                else break;            }            //在上层for循环结束后,存在两种情况            //tmp比它之前所有距离为Increment的数都小,则将tmp插入到最前面            //遇到break;意味着,tmp>a[j-Increment],则将tmp插入a[j]            a[j] = tmp;        }    }}int main(){    int arr[12]={3,4,5,6,24,13,26,1,2,27,38,15};    ShellSort(arr, 12);    for(int i; i <12; i++){        cout<<arr[i]<<' ';    }}


0 0