明白了原理之后自己写了个希尔排序,这个Shell排序的时间复杂度貌似有点大;
感觉有点复杂,还好能够运行
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={10,9,8,7,6,5,4,3,2,1,13,11,78};
int length=sizeof(a)/sizeof(int);
int d=length/2;
//首先要明白这个d就是步长
//希尔排序明白原理之后最重要的就是分组,这个分组看是简单,实际上有点不好控制(想与做看是近,却很远)
//我是这样想的 对于数组a
//d=6即步长为6
/*
0 1 2 3 4 5 0 1 2 3 4 5 0
10,9,8,7,6,5,4,3,2,1,13,11,78
*/
//头上为0的为一组:10,4,78采用直接插入法,进行排序得出结果为4,10,78
//头上为1的为一组:9,3采用直接插入法,进行排序得出结果为3,9
//头上为2的为一组:8,2采用直接插入法,进行排序得出结果为2,8
//头上为3的为一组:7,1采用直接插入法,进行排序得出结果为1,7
//头上为4的为一组:6,13采用直接插入法,进行排序得出结果为6,13
//头上为5的为一组:5,11采用直接插入法,进行排序得出结果为5,11
//所以第一次希尔排序结果:4 3 2 1 6 5 10 9 8 7 13 11 78
//d=3即步长为3
/*
0 1 2 0 1 2 0 1 2 0 1 2 0
4 3 2 1 6 5 10 9 8 7 13 11 78
*/
//头上为0的为一组:4,1,10,7,78采用直接插入法,进行排序得出结果为1,4,7,10,78
//头上为1的为一组:3,6,9,13采用直接插入法,进行排序得出结果为3,6,9,13
//头上为2的为一组:2,5,8,11采用直接插入法,进行排序得出结果为2,5,8,11
//所以第二次希尔排序结果:1,3,2,4,6,5,7,9,8,10,13,11,78
//d=1 坑爹啊,就是直接插入排序,这个希尔也够厉害的哈!只不过比我们先出生而已
//知道这点就出名了,在直接插入排序之前,其实排序已经处于相对稳定状态,移动的次数较少
//0 0 0 0 0 0 0 0 0 0 0 0 0
//1,3,2,4,6,5,7,9,8,10,13,11,78
for (int d = n / 2; d >= 1 ; d = d / 2)
{
for (int i = d;i < n; i = i + d)
{
int temp = vector[i];
int j = i;
for (; j > 0 && vector[j - d] > temp; j = j - d)
{
vector[j] = vector[j - d];
}
vector[j] = temp;
}
}