插入排序算法

插入排序

618买了本算法导论,考完试10号,旅游完回来15号,又出去聚会了两天,终于开始学习了= =
第一个算法就是这个插入排序,道理很简单,后一个数和前一个数比较大小,交换顺序,最终按大小排好顺序。下面放一张原理图:
插入排序模拟图
上图中还给出了伪代码,然后我稍作修改,用c写出了这个程序:

#include<stdio.h>
void InsertionSort(int []);
int main()
{
	int a[5], i;
	for(i = 0; i < 5; i++)
	{
		scanf("%d", &a[i]);
	}
	InsertionSort(a);
	for(i = 0; i < 5; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

void InsertionSort(int num[])
{
	int j, k, key;
	for(j = 1; j < 5; j++)
	{
		key = num[j];
		k = j - 1;
		while(k >= 0 && num[k] > key)
		{
			num[k + 1] = num[k];
			k = k - 1;
		}
		num[k + 1] = key;
	}
}

测试结果如下:
插入排序测试结果
在代码的第26行,把 num[k] > key 改成 num[k] < key 就能实现降序排序。
再说一下循环不变式,它的三个性质:初始化、保持、终止,可以帮助判断算法的正确与否。
循环不变式三性质
保持这一性质是判断算法是否正确很关键一点,要保证每次迭代时 A[j] 之前的数已经排好序。
这个插入排序还是挺简单的,容易理解而且代码量少,后面就要学分析算法,看的一脸懵逼。这本书估计大四都学不完了orz
争取3天更一次博

posted @ 2020-07-20 13:25  Jay_Auditore  阅读(151)  评论(0编辑  收藏  举报