关于C语言的插入排序和折半排序

插入排序(若从左到右依次递增排序)

插入排序是在一段组合数字中,从左到右找到第一个非递增函数,然后将找到的这个非递增数插入到组合序列当中。

代码如下:

#include<iostream>
using namespace std;
void InsertSort(int a[6], int len) {
	int i, j;
	for ( i = 2; i < len; i++) {
		//如果前面的值小于后面的值
		if (a[i] < a[i - 1]) {
			a[0] = a[i]; //设置哨兵
			for ( j = i - 1; a[0] < a[j]; j--) { //从后往前找到需要放到的位置
				a[j + 1] = a[j];//向后面移动一个
			}
			a[j + 1] = a[0];  //赋值给正确的位置
		}
	}
}
//打印函数
void print(int a[6]) {
	for (int i = 1; i < 6; i++) {
		cout << a[i];
	}
}
//主函数
int main() {
	int a[6] = { 0,1,3,5,6,4 };//0的位置是哨兵,设置初始为0;
	InsertSort(a, 6);
	print(a);

}

1.首先将 i 的值设置为2,因为我们数组的在下标0位置是要设置哨兵的位置,第二个位置直接在循环中和第一个位置进行比较即可,依次循环

2.当找到非递增数字的时候,把这个数字复制到哨兵的位置,并设置前一个数字的下标为 j

3.这个时候我们要找到非递增数字需要插入的位置,并且将后面的数字往后移动一个下标(加1)

1)设置循环,当a[j] 恒大于a[0]的时候将 a[j] 向后移动一个位置 并把 j = j - 1

2)当不满足a[j] 恒大于a[0]的时候,就找到了需要插入的位置,把哨兵的值赋值给 a[j + 1]

这个时候插入排序就完成了。

折半排序

折半排序用到了折半查找的方法,将第2个下标放到前面的集合中(这时只有a[1] ), 根据循环将a[2]- a[n]依次放到前面的集合中

代码如下:

#include<iostream>
using namespace std;
void HalfSort(int a[6], int len) {
	int i, j ,low,high,mid;//定义所需要的变量
	for (i = 2; i < len; i++) {//依次向后找到需要排序的数字
		a[0] = a[i];//设置哨兵
		low = 1;
		high = i - 1;
		while (low <= high) { //折半查找
			mid = (low + high) / 2;
			if (a[mid] < a[0]) {
				low = mid + 1;
			}
			else if (a[mid] > a[0]) {
				high = mid - 1;
			}
		}
		for (j = i - 1; j > high; j--) {//插入到集合当中
			a[j + 1] = a[j];
		}
		a[high + 1] = a[0];
	}

}
void print(int a[6]) {
	for (int i = 1; i < 6; i++) {
		cout << a[i];
	}
}
int main() {
	int a[6] = { 0,1,3,5,6,4 };//0的位置是哨兵,设置初始为0;
	HalfSort(a, 6);
	print(a);
}

1. 折半查找设置了5个变量,首先将i = 2。依次找到a[i], 并复制到哨兵给a[0],在前面的集合当中设置一个low的数组下标为1和high的数组下标等于i-1;

2.设置一个whlie循环,循环条件为low < high, 找到mid的中值,当a[mid]>a[0], 将high = mid - 1, 若a[mid]<a[0], 将low = mid + 1. 折半查找方式

3.当结束循环的时候就找到了需要插入的位置,设置j = i -1 ,(和插入排序相似) 结束的循环条件为j > high, 在循环的过程中将后面的下标向后移动一个,找到位置后a[high + 1] = a[0];

这时候折半排序就完成了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值