直接插入排序 Shell(希尔)排序

直接插入排序

生成100~999之间的随机数的方法原来没见过,挺有趣的

插入的时候判断条件不要少写

/*        直接插入排序       */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10


void CreatData(int a[],int n,int low ,int high);
void InsertSort(int a[],int n);

int main()
{
	int i,data[N];
	CreatData(data,N,100,999);
	printf("排序前:\n ");
	for ( i = 0; i < N; ++i)
	{
		printf("%d ",data[i] );
	}
	printf("\n");

	InsertSort(data,N);
	printf("排序后: \n");
	for ( i = 0; i < N; ++i)
	{
		printf("%d ",data[i] );
	}
	printf("\n");
	return 0;

}

void CreatData(int a[],int n ,int low ,int high)                //生成low~high之间的随机数并复制给数组a
{
	int i,k;
	double d;
	srand(time(NULL));
	for (i = 0; i < n; ++i)
	{
		d = (double)rand()/((double) RAND_MAX+1);
		k = (int)(d*(high-low+1));
		a[i] = k + low;
	}
}

void InsertSort(int a[],int n)
{
	int i,j,temp;
	for (i = 1; i < n; i++)                    //从无序区头部开始,将其中每个每个元素插入到有序区
	{
		temp = a[i];
		for(j = i-1 ; j >=0 && temp < a[j];j--)        //在有序区查找应插入的位置
		{
			a[j+1] = a[j];   //后移一个位置
		}
		a[j+1] = temp;      //插入
	}
}

希尔排序

对直接插入排序进行改进   间隔的选择是希尔排序的重要部分

基本思想:

先将要排序的N 个数按间隔gap分成若干组,每组的元素的相差gap,对每组的全部元素进行直接插入排序,然后再用一个较小的间隔重复上述分组和排序,直至间隔为1.

/*        希尔排序       */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10


void CreatData(int a[],int n,int low ,int high);
void ShellSort(int a[],int n);

int main()
{
	int i,data[N];
	CreatData(data,N,100,999);
	printf("排序前:\n ");
	for ( i = 0; i < N; ++i)
	{
		printf("%d ",data[i] );
	}
	printf("\n");

	ShellSort(data,N);
	printf("排序后: \n");
	for ( i = 0; i < N; ++i)
	{
		printf("%d ",data[i] );
	}
	printf("\n");
	return 0;

}

void CreatData(int a[],int n ,int low ,int high)                //生成low~high之间的随机数并复制给数组a
{
	int i,k;
	double d;
	srand(time(NULL));
	for (i = 0; i < n; ++i)
	{
		d = (double)rand()/((double) RAND_MAX+1);
		k = (int)(d*(high-low+1));
		a[i] = k + low;
	}
}

void ShellSort(int a[],int n)
{
	int gap,i,j,temp;

	for(gap = n/2;gap > 0 ; gap/=2)        //初始间隔为 n/2 ,以后每趟间隔缩小一半
	{
		for(i = gap ; i< n ;i++)
		{
			temp = a[i];
			/* 对一组间隔为gap的元素进行插入排序*/                
			for(j = i-gap;j>=0&&a[j]>temp; j-=gap)
			{
				a[j+gap] = a[j];
			}
			a[j+gap] = temp;       //插入
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值