插入排序

原创 2015年11月20日 15:07:08
//插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 
//直接查找排序
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++;
	}
}

经典排序算法----直接插入排序算法及其改进(稳定)

直接插入,平均情况O(n2),最好情况O(n),最坏情况O(n2),辅助空间O(1),稳定。...
  • qianqin_2014
  • qianqin_2014
  • 2016年04月21日 21:17
  • 644

直接插入排序中的监视哨问题

今天看到直接插入排序,直接排序没咋懂,倒是直接懵掉了。代码看得懂,就是不知道哨兵(又叫监视哨,Sentinel)到底有啥用,于是痛下决心一定要将它搞定。 首先来科普一下直接插入排序(这个没啥难的,看一...
  • xuyangcao123
  • xuyangcao123
  • 2016年06月15日 18:15
  • 2652

golang 算法 插入排序

golang 多种方法实现插入排序算法
  • CodyGuo
  • CodyGuo
  • 2016年09月09日 19:56
  • 483

C++排序之直接插入排序法

直接插入排序算法是将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点...
  • lycx1234
  • lycx1234
  • 2017年02月07日 09:09
  • 1169

数据结构例程——插入排序之直接插入排序

本文是[数据结构基础系列(9):排序]中第2课时[插入排序之直接插入排序]的例程。1.直接插入排序#include #define MaxSize 20 typedef int KeyType; ...
  • sxhelijian
  • sxhelijian
  • 2015年11月28日 16:48
  • 3678

插入排序算法之C++实现

插入排序,顾名思义其实现形式是插入. 在整个大小不一的队列中, 第一次: 从一个元素开始,将后面相邻的元素(第二个元素)提取出来,放在一个变量中暂时保存,然后和第二个元素前面的那个元素(第一个元素)做...
  • stzy00
  • stzy00
  • 2015年03月12日 23:31
  • 1498

排序算法一:直接插入排序

在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排序算法做一个全面的梳理,从最简单的“冒泡”到高效的堆排序等。...
  • LG1259156776
  • LG1259156776
  • 2015年09月23日 22:08
  • 41915

数据结构之---C语言实现直接插入排序

数据结构之---C语言实现直接插入排序
  • u012965373
  • u012965373
  • 2015年09月06日 23:01
  • 5272

排序之直接插入排序

排序
  • he315889714
  • he315889714
  • 2014年12月12日 15:14
  • 1291

使用C#详解常用排序算法(二):插入排序(Insert Sort)

结合代码和运行输出详细讲解插入排序的排序过程
  • qqiang00
  • qqiang00
  • 2015年08月09日 09:48
  • 647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:插入排序
举报原因:
原因补充:

(最多只允许输入30个字)