排序算法(三) 直接插入排序与折半插入排序

一、什么是插入类排序?

        插入类排序默认有一个已经排好序的序列,而后面的操作就是将未排好序的元素有序插入到已排好序的序列中。

 将所有未排好序的元素插入到合适位置,即可得到一个有序序列。

二、需要了解的几类插入类排序算法。

       (1)、直接插入排序

                    直接插入排序是一种基本的插入排序算法。算法思路很简单!以升序为例:


              <1>、 将序列的第一个元素看成一个有序序列(任何一个单元素都可以看成有序序列)。


              <2>、 从第二个元素开始向后遍历。 将第二个元素插入到第一个元素的前面(如果比第一个元素小),否则置不变。


              <3>、 然后继续看第三个元素,此时前两个元素是按升序有序的。将第三个元素按顺序和第二个元素、第一个元素进行比较,将其放入合适的位置。


              <4>、 直到最后一个元素也被放入前面的有序序列的合适位置,那么排序完成。

              过程如下图 :

                           

直接插入排序源代码 :

/*
**功能: 直接插入法升序排序一个序列
**参数说明:
**@record : 序列数组 @len : 序列长度
**返回值: 无
*/
void InsertSort(int record[], int len)
{
	int i, j;
	int value;   //存储待插入元素值

	//从第二个元素开始插入排序,第一个元素默认是有序的
	for (i = 1; i < len;i++)
	{
		value = record[i];

		//寻找合适的插入位置
		j = i - 1;
		while (j >= 0 && record[j] >= value)
		{
			record[j + 1] = record[j];
			j--;
		}

		//将待排元素插入到合适的位置
		record[j + 1] = value;
	}
}


       (2)、折半插入排序

                    折半插入与直接插入很像!唯一的区别在于它寻找插入位置的方法不同,直接插入是对有序表进行顺序遍历查找,而折半插入中的“折半”就体现在此处,它寻找插入位置是进行折半查找。大大增加了查找效率,但未改变移动元素的时间耗费。


折半插入排序源代码:

void BinSort(int record[], int len)
{
	int i, j;
	int value;   //存储待插入元素值
	int low, high, mid;  //用于折半查找的变量

	//从第二个元素开始插入排序,第一个元素默认是有序的
	for (i = 1; i < len;i++)
	{
		value = record[i];

		//折半法寻找插入位置
		low = 0;
		high = i - 1;
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (value < record[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}

		//移动元素,为放置待排元素腾位置
		for (j = i - 1; j >= low;j--)
		{
			record[j + 1] = record[j];
		}

		//将待排元素插入到合适的位置
		record[low] = value;
	}
}
int main(void)
{
	int record[] = { 48,62,35,77,55,14,35,98 };
	int len = sizeof(record) / sizeof(record[0]);
	int i = 0;

	printf("排序前: \n");
	for (i = 0;i < len;i++)
	{
		printf("%d  ", record[i]);
	}
	puts("");

	BinSort(record, len);

	printf("排序后: \n");
	for (i = 0;i < len;i++)
	{
		printf("%d  ", record[i]);
	}
	puts("");

	return 0;
}

运行截图 :
                                




       (3)、希尔排序(放在下一篇讲解)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值