Shell排序还可以这样写

明白了原理之后自己写了个希尔排序,这个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;
			}

		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值