插入排序算法
来源:互联网 发布:淘宝宝贝涨价被降权了 编辑:程序博客网 时间: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
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法---插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法---插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- NSURLSession - NSURLSessionTask 和 delegate
- 1194_八进制
- centos6.7 x64搭建tmate server
- C8-1 复数加减乘除
- hdu 1698 Just a Hook(区间更新)
- 插入排序算法
- javascript基础 label标签焦点转移 2017年1月26日
- [杜教筛] 51Nod 1227 平均最小公倍数
- Linux下 Spark Scala IDE工作环境搭建
- 数据结构实验之队列一:排队买饭
- POJ1007 DNA Sorting
- 3.1入门模拟B1046. 划拳(15)
- 寒假10days集训总结
- ARM之6410内存初始化