排序算法概念以及插入排序算法实现(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法概念以及插入排序算法实现(C语言)相关的知识,希望对你有一定的参考价值。

一、排序算法概念

(一)什么是排序?

  • 排序(Sort),就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。

(二)排序算法的评价指标

  • 算法的稳定性。若待排序表中有两个元素Ri和Rj,其对应的关键字相同即keyi = keyj,且在排序前Ri在Rj的前⾯,若使⽤某⼀排序算法排序后,Ri仍然在Rj的前⾯,则称这个排序算法是稳定的,否则称排序算法是不稳定的。

(三)排序算法的分类

  1. 内部排序:数据都在内存中【关注如何使用算法时,空间复杂度更低】
  2. 外部排序:数据太多,无法全部放入内存【还要关注如何使读/写磁盘次数更少】

二、插入排序

  • 算法思想:每次将⼀个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。

(一)算法实现

1. 插入算法实现

//直接插入排序
void InsertSort(int A[], int n){
	int i,j,temp;
	for(i-1; i<n; i++){	//将各元素插入已排好序的序列中
		if(A[i]<A[i-1]){//若A[i]关键字小于前驱
			temp=A[i];	//用temp暂存A[i]
			for(j=i-1; j>=0&&A[j]>temp; --j){//检查所有前面已排好序的元素
				A[j+1]=A[j];//所欲大于temp的元素都向后挪位
			}
			A[j+1]=temp;	//复制到插入位置
	}
}

2. 算法实现(带哨兵)

void InsertSort(int A[], int n){
	int i,j;
	for(i=2; i<=n; i++){	//依次将A[2]~A[n]插入到前面已排序序列
		if(A[i]<A[i-1]){	//若A[i]关键码小于其前驱,将A[i]插入有序表
			A[0]=A[i];		//复制为哨兵,A[0]不存放元素
			for(j=i-1; A[0]<A[j]; --j){//从后往前查找待插入位置
				A[j+1]=A[j];//向后挪位
			}
			A[j+1]=A[0];	//复制到插入位置
		}
	}
}

(二)算法效率分析

  • 空间复杂度:O(1)
  • 时间复杂度:主要来自对比关键字、移动元素若有 n 个元素,则需要 n-1 趟处理


(三)优化——折半插入排序

  • 思路:先用折半查找找到应该插入的位置,再移动元素

  • 当 low>high 时折半查找停止,应将 [low, i-1] 内的元素全部右移,并将 A[0] 复制到 low 所指位置


  • 当 A[mid]==A[0] 时,为了保证算法的“稳定性”,应继续在 mid 所指位置右边寻找插入位置
  • 当 low>high 时折半查找停止,应将 [low, i-1] 内的元素全部右移,并将 A[0] 复制到 low 所指位置
  • 当 A[mid]==A[0] 时,为了保证算法的“稳定性”,应继续在 mid 所指位置右边寻找插入位置


  • 当 low>high 时折半查找停⽌,应将 [low, i-1] 内 的元素全部右移,并将 A[0] 复制到 low 所指位置
  • 当 low>high 时折半查找停止,应将 [low, i-1] 内的元素全部右移,并将 A[0] 复制到 low 所指位置

  • 当 low>high 时折半查找停止,应将 [low, i-1] 内的元素全部右移,并将 A[0] 复制到 low 所指位置
  • 当 A[mid]==A[0] 时,为了保证算法的“稳定性”,应继续在 mid 所指位置右边寻找插入位置

以上是关于排序算法概念以及插入排序算法实现(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

插入排序算法及C语言实现

八大排序算法(C语言实现)

C语言-排序算法——插入排序

C语言实现八大排序算法

C语言实现九大排序算法(建议收藏!)