基本排序系列之希尔排序

                                                     希尔排序

一、希尔排序的基本思想

希尔排序的基本思想就是把数进行分组,按照一定的规律分组,最先可以按照d1这个增量分组,d1=n/2(n为数组中数的长度)来分成d1个分组,然后对分组内部的数进行直接插入排序再设置第二个增量d2来分组,如d2 = d1/2这样来分组直到增量为1停止。


二、对于这样的一个数组:

a[10] ={2,1,4,3,5,7,6,8,0,9}

d1增量为10/2= 5

                           2    1     4    3     5    7     6    8     0    9

这样分组得到(2,7),(1,6),(4,8),(3,0),(5,9)

执行后为:

                     2   1   4    0     5     7    6    8    3    9 

d2增量为5/2=2

分组得到:(1,0,7,8,9),(2,4,5,6,3)

执行后:

                     

                             2   0     3    1     4    7     5    8    6    9 

d2增量为2/2=1

执行后:

                      0   1     2    3     4    5     6    7   8     9 


核心代码:

for(d = length/2;d >0;d=d/2){//设置增量第一次增量为5,第二次为2第三次为1
	         for(int i = d;i<length ;i++){//对应的比较的次数分别是5,8,11次
				 //接下来做交换
				 for(int j = i-d;j>=0 ;j=j-d){
				     if(a[j]>a[j+d]){
					       temp = a[j];
				  	      a[j] =a[j+d];
						  a[j+d] = temp;
				     }
				     
				 }
	         }
}


全部代码:

/**
*希尔排序
*@author 菜鸟
*@version 2014.6.13
*/

/**
*希尔排序原理
*希尔排序先是随便选一个小于数组长度n的d1作为第一个增量,
*下一步将其分为d1个分组,让是d1的倍数在同一个分组中,每
*次增量值只能减小按此分组直到d1为1时为止。
*对每一个分组进行直接插入排序。
*/
//此列以length为10 的数组为例
#include <iostream>
#include <windows.h>
using namespace std;
void shell_sort(int a[],int length){
	  int d;//表示增量
	  int temp=0;
	  int j;
	  for(d = length/2;d >0;d=d/2){//设置增量第一次增量为5,第二次为2第三次为1
	         for(int i = d;i<length ;i++){//对应的比较的次数分别是5,8,11次
				 //接下来做交换
				 for(int j = i-d;j>=0 ;j=j-d){
				     if(a[j]>a[j+d]){
					       temp = a[j];
				  	      a[j] =a[j+d];
					      a[j+d] = temp;
				     }
				     
				 }
	         }
	  }


}


int main(){
	int a[10] = {2,1,4,3,5,7,6,8,0,9};
	shell_sort(a,10);
	for(int i =  0;i <10;i++){
	     cout<<"第"<<(i+1)<<"个元素:"<<a[i]<<endl;
	}
	getchar();
     system("PAUSE");
	 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值