《考研数据结构-插入排序》

本文介绍了三种插入排序算法:直接插入排序、折半插入排序和希尔排序。直接插入排序通过依次将元素与已排序部分进行比较并插入正确位置实现排序;折半插入排序利用折半查找优化了比较过程;希尔排序则是通过间隔序列改进直接插入排序,提高效率。这些排序算法在不同场景下各有优势,适用于理解和实现基础排序算法。

插入排序有三种算法

1.直接插入排序

算法的思想比较简单,比如待排序序列 {5,4,6,2} ,进行从小到大排序,则从第一个元素开始,与其之前所有的元素进行比较
第一个5之前没有则还是 {5,4,6,2}
第二个4与5比较进行交换位置 {4,5,6,2}
第三个6与5比较,大于后不再进行比较,因为5之前已经有序(请注意思考为什么) 序列不		       变{4,5,6,2}
第四个2需要与6,5,4都要比较	{2,4,5,6}
**对于刚才的提问,可以设想下一个待比较元素之前的元素都是有序的,所以只有更小才可能移动**
#include<stdio.h>
#define Max 8
//直接插入排序适用于 顺序存储结构和链表
//平均排序时间 n^2
//稳定的排序方法
void InsertSort(int sortArr[],int length) {
	//升序
	int i,j,temp;
	for( i=0;i<length;++i) {
		temp=sortArr[i];
		for (j=i-1; j>=0 && sortArr[j]>temp; --j) {
			sortArr[j+1]=sortArr[j];
		}
		sortArr[j+1]=temp;
	}
}
void InsertSortAverse(int sortArr[],int length) {
	//降序
	int i,j,temp;
	for( i=0;i<length;++i) {
		temp=sortArr[i];
		for (j=i-1; j>=0 && sortArr[j]<temp; --j) {
			sortArr[j+1]=sortArr[j];
		}
		sortArr[j+1]=temp;
	}
}
void display(int sortArr[],int length, char *p) {
	printf("%s\n",p);
	for (int i = 0; i < length; ++i)
	{
		printf("%d ", sortArr[i]);
	}
	printf("\n");
}
int main() {
	int sortArr[Max]={ 8, 7, 5, 6, 1, 2, 3, 4};
	InsertSort(sortArr, Max);
	display(sortArr, Max, "elect sort is");
	InsertSortAverse(sortArr, Max);
	display(sortArr, Max, "decline sort is");
	return 0;
} 

2.折半插入排序

**算法思想与直接插入排序,不过进行之前比较的并不是顺序比较而不是折半比较**
折半比较的思想在查找那一章节有涉及

3.希尔排序

**希尔排序的思想与直接插入排序算法比较类似,不过多分了一些模块,不再次解释**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值