希尔排序

        该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

/*希尔排序*/
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#include <iostream>
using namespace std;

#define MAX 11  
void input(int num[])//产生10个随机数 1......10(MAX-1)  
{  
	int i;   
	srand((unsigned)time(NULL));  
	for(i=1; i<MAX; i++)  
		num[i]=rand()%100;  //产生100以内的随机数
}  
void output(int num[])//打印
{  
	int i;  

	for(i=1; i<MAX; i++)  
	{  
		printf("%5d", num[i]);  
		if(0 == i%10)  
			printf("\n");  
	}  
	printf("\n");  
}  
//void shell_sort(int num[],int left,int right)//数组 1 10
//{  
//   int i,j,gap=right-left+1;
//   int n=gap;
//   do{
//	   gap=gap/3+1;
//		for(i=0;i<gap;i++)//直接插入排序
//		{
//			for (j = i + gap; j <= n; j += gap)//第i个元素有序,从第i+gap个元素开始
//			{
//				if (num[j] < num[j - gap])  
//                {  
//                    int temp = num[j];  
//                    int k = j - gap;  
//                    while (k >= 1 && num[k] > temp)  //如果大于待排序元素,则后移一位
//                    {  
//                        num[k + gap] = num[k];  
//                        k -= gap;  
//                    }  
//                    num[k + gap] = temp;  
//                }  
//			}
//		
//		}
//   }while(gap>1);
//}  

void shell_sort(int num[],int left,int right)//数组 1 10
{  
	int i,j,gap=right-left+1;
	int n=gap;
	do{
		gap=gap/3+1;
		for (j = 1 + gap; j <= n; j++)直接插入排序:第i个元素有序,从第i+gap个元素开始
		{
			if (num[j] < num[j - gap])  
			{  
				int temp = num[j];  
				int k = j - gap;  
				//while (k >= 1 && num[k] > temp)  //如果大于待排序元素,则后移一位
				//{  
				//	num[k + gap] = num[k];  
				//	k -= gap;  
				//}  
				do{  
				    num[k + gap] = num[k];  
					k -= gap;  
				}while (k >= 1 && num[k] > temp);  //如果大于待排序元素,则后移一位 
				num[k + gap] = temp;  
			}  
		}
	}while(gap>1);
}  

void main()  
{  
	int num[MAX];  

	input(num);  

	printf("sort before...\n");  
	output(num);  
	shell_sort(num,1,MAX-1);  

	printf("sort after...\n");  
	output(num);      
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值