插入排序【算法导论】
2013-02-16 14:00
211 查看
算法描述
插入排序是一种就地,增量排序,不需要额外的存储空间。它主要是针对小数据两的排序。核心思想:类似抓扑克牌,右手抓牌向左手持有的牌中插入,每次插入后保证左手持有的扑克牌是有序的。
伪代码
for j-<2;j<length[A];j++ key=A[j]; i=j-1; while i>0 and A[i]>key A[i+1]=A[i]; i--; A[i+1]=key;
算法证明(循环不变式)
初始化:在第一次遍历时,子数组A[0..j-1],只有一个元素,它已经是有序的。保持:进入子循环时,在子数组A[j-1],A[j-2]....A[0]从后向前查找,若key小于子元素,则当前子元素向前移动一个位置。从而保证了子数组的有序性。
终止:最后一次循环,j>length[A]时,外层循环结束,子数组[1..n]就是整个数组,已经排好序了,证明了算法正确性。
代码C实现
#include<stdio.h> #include "insertsort.h" int insertsort(int *p,int length){ int key=0; int i = 0; int j = 0; if(p == NULL || length < 1){ printf("array is empty or length of array is zero\n"); return 0; } for(i = 1;i < length;i++){ key = *(p+i); j = i - 1; while(j >= 0 && *(p + j) > key){ *(p+1+j) = *(p+j); j--; } *(p + j + 1) = key; } return 1; }
相关文章推荐
- [多图预警详细演示一步一步写算法导论]插入排序
- 插入排序--算法导论
- 算法导论:插入排序
- 算法导论--插入排序
- 算法导论1:插入排序和归并排序 2016.1.1
- 【算法导论】2-1 插入排序insertion-sort.cpp
- 插入排序的递归实现和二分查找递归实现,算法导论2.3-4和2.3-5
- 一头扎进算法导论-插入排序
- 【算法导论】插入排序
- 「算法导论」:插入排序
- 基础算法:插入排序
- 白话经典算法系列之二 直接插入排序的三种实现
- 第十五周项目1 验证算法(1)插入排序之直接插入排序
- 第十六周项目1-验证算法插入排序之希尔排序
- 【算法导论 第7章 快速排序】
- 算法导论-7-6 对区间的模糊排序
- 算法学习之:插入排序
- 麻省理工算法导论学习笔记(5)----线性时间排序
- 算法--排序--插入
- 算法系列(三)插入排序的两种改进:规避边界检测和取消交换(Java实现)