插入排序算法

来源:互联网 发布:淘宝宝贝涨价被降权了 编辑:程序博客网 时间:2024/06/16 05:53

阅读此篇文章大概需要5分钟。
这篇文章以插入排序为例,介绍正文中框架的内容。由于公众平台中防止代码不方便,若格式存在问题请点击左下角的阅读原文。

插入排序是一种适用于少量元素排序的有效算法,它的工作方式类似于整理扑克牌:将无序的扑克牌放在桌子上,每次我们均从桌子上拿走一张扑克牌,将其插入到合适的位置(从右向左依次对比,找到合适的位置就插入进去)。

根据以上思想,书写出伪代码,我们将过程命名为INSERTION-SORT:

INSERTION-SORT(A):for j = 2 to A.length    key = A[j]    i = j - 1    while i > 0 and A[i] > key        A[i + 1] = A[i]        i = i - 1    A[i + 1] = key

根据该伪代码,我们探究算法的循环不变式:

初始化:在第一次循环迭代之前,排序子数组(左手中的扑克牌)只有一个元素,也就是A[1],这时子数组是排好序的(由于只有一个元素,所以是一种特殊状态)。

保持:每次循环迭代过程中,我们均将A[j]与其左边已排好序的元素进行比较,当找到合适的位置时,将其插入到子数组中,所以子数组元素个数+1,但依旧保持有序状态。

终止:终止条件时,所有的元素都已经进行过一次循环比较,找到了自己合适的位置,所以此时数组已经完成排序,算法正确性得到证明。

算法的性能分析:分析过程我们跳过关于指令所需常量时间的列举过程,如有兴趣可参考《算法导论》原文,在对其时间进行求和后,可以得到其最坏运行时间的表达式:an²+bn+c,其中常量a,b,c依赖于单语句执行的常量时间。从表达式可看出,其最坏时间是关于n的二次函数,当n的数值极大时,一次项和常数项将对表达式构成极小影响,所以我们只考虑它的增长率,并将其最坏运行时间记录为O(n²) (读作theta n平方)。

该算法的C++实现:

void insertion-sort(int arr[],int n){    int key = 0;    int i = 0;    for ( int j = 1; j < n; j++ ){        key = arr[j];        i = j - 1;        while(i >= 0 && arr[i] > key){            A[i + 1] = A[i];            i = i - 1;            }        A[i + 1] = key;        }
0 0
原创粉丝点击