插入排序

//插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 
//直接查找排序
void direct_sort(int* list,int lenth)
{
	for(int i=1;i<lenth;i++)//循环从第2个元素开始
	{
		if(list[i]>list[i-1])
		{
			int temp=list[i]; //哨兵
			int j = 0;
			for(j=i-1;j>=0 && list[j]<temp;j--)//list[j]<temp 防止越界哨兵
			{
				//直接插入排序从尾结点边比较边移动元素,
				//而并非等找到插入点后再移动元素.所以从尾结点开始向头结点找插入点则效率更好.
				//符合要求的有序数组后移一位
				list[j+1]=list[j];
			}
			list[j+1]=temp;//哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;
		}
		printf("第%d趟:",i);
		for (int i = 0; i< lenth; i++)
		{
			printf("%d  ",list[i]);
		}
		printf("\n");
	}
}

//半分查找排序
void binary_search_sort(int* list,int lenth)
{
	int outer, inner;
	//outer loop
	for (outer = 1; outer < lenth; outer++)
	{
		int temp = list[outer]; 哨兵
		int low = 0, high = outer;  //已经排好序的数组的上下界

		//在已经排好序的的数组中进行半分查找
		while (low <= high)
		{
			int mid = (low + high) / 2; //折半数组
			if (temp < list[mid])
				low = mid + 1;   //需要插入的数组在右边
			else
				high = mid - 1;  //需要插入的数组在左边
		}

		//右边的数组右移一位
		for (int j = outer - 1; j > high; j--)
		{
			list[j + 1] = list[j];
		}
		//将待排序组插入
		list[high + 1] = temp;
		printf("第%d趟:",outer);
		for (int i = 0; i< lenth; i++)
		{
			printf("%d  ",list[i]);
		}
		printf("\n");
	}
}

//希尔排序的基本思想是:
//把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
//随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
void shell_sort(int* list,int lenth)
{
	int gap = lenth / 2;
	int i = 0;
	while (1 <= gap) 
	{
		// 把距离为 gap 的元素编为一个组,扫描所有组
		for (int i = gap; i < lenth; i++)
		{
			int j = 0;
			int temp = list[i];//哨兵

			// 对距离为 gap 的元素组进行直接插入排序
			for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) 
			{
				list[j + gap] = list[j];
			}
			list[j + gap] = temp; //哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;
		}
		printf("第%d趟:",i);
		for (int i = 0; i< lenth; i++)
		{
			printf("%d  ",list[i]);
		}
		printf("\n");
		gap = gap / 2; // 减小增量
		i++;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值