插入排序

原创 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++;
	}
}

相关文章推荐

C++实现插入排序

  • 2017年11月02日 22:26
  • 712B
  • 下载

插入排序(C语言实现)

  • 2014年11月30日 16:12
  • 926B
  • 下载

数据结构基础(3) --Permutation & 插入排序

Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutati...

插入排序的方法

  • 2013年07月10日 12:12
  • 31KB
  • 下载

直接插入排序的C实现

  • 2013年05月16日 11:20
  • 495B
  • 下载

链表 操作3 双向链表的 插入排序法

昨天做了某公司的数据结构笔试题: 其中一个小功能 是要求对 双向链表进行 快速排序。   思想: 借用了  nginx 链表排序思想  head   prev next  假设: 从小到大排序 从...

插入排序源代码

  • 2013年07月31日 08:39
  • 585B
  • 下载

直接插入排序

  • 2014年03月25日 15:22
  • 1.02MB
  • 下载

插入排序伪代码与编程实现

比如我有一个待排序(升序)的数组A[10] = {5,2,4,1,9,3,6,7,0,8}; 首先我们会从第二个数字‘2’开始 1) 数字‘2’,跟‘5’比,‘...

插入排序的算法代码和描述

  • 2013年12月09日 09:14
  • 20KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:插入排序
举报原因:
原因补充:

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