维基百科:http://zh.wikipedia.org/wiki/插入排序

算法思想:
若数组A[n]的前n-1个数已经有序,我们只需把第n个元素插入到适当的位置即可。易分析得算法的时间复杂度为Ο(n^2)

具体描述:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。

一、简单插入排序(simple insertion sort)

#include <cstdlib>
#include <iostream>using namespace std;//iterative implementation
template<class T>
void simpleInsertionSort(T *a, int n)
{T temp;int j;for(int i=1; i<n; i++){temp = a[i];j = i-1;while(j >= 0 && a[j] > temp){a[j+1] =  a[j];j--;}a[j+1] = temp;  //put a[i] to right place}
}//recursive implementation
template<class T>
void insertionSort(T *a ,int n)
{if(n>1){insertionSort(a,n-1); //sort the first n-1 elements recursivelyinsert(a,n);          //insert a[n-1] in a[0..n-2]}
}/* n the size of the array* assume the first n-1 elements is already sorted
*/
template<class T>
void insert(T *a, int n)
{T temp = a[n-1];int i = n-2;while(i >= 0 && a[i] > temp){a[i+1] = a[i];i--;}a[i+1] =  temp;
}int main(int argc, char *argv[])
{int n;int *a = NULL;while(cin>>n && n > 0){a = new int[n];for(int i=0; i<n; i++){cin>>a[i];}//simpleInsertionSort(a,n);insertionSort(a,n);for(int i=0; i<n; i++){cout<<a[i]<<" ";}cout<<endl<<endl;delete [] a;}system("PAUSE");return EXIT_SUCCESS;
}

二、二分查找排序(binary search sort)

template<class T>
void binarySearchSort(T *a, int n)
{T temp;int low ,mid,high;for(int i=1; i<n; i++){temp = a[i];            //暂存记录 low = 0;high = i-1;while(low <= high)       //寻找插入点{mid = (low + high)/2;if(temp < a[mid])high = mid - 1;     //插入点在低半区间elselow = mid + 1;      //插入点在高半区间}//high+1为插入点for(int k=i-1; k>=high+1; k--)//记录后移{a[k+1] = a[k];}a[high+1] = temp;//插入到适当位置}
}

注意:

1、虽然折半查找减少了比较次数,但是没有减少移动次数,因而折半插入排序的算法时间复杂度仍为Ο(n^2)

2、折半插入,插入点的确定:
(1)考虑特殊情况,当区间[0,i]恰好是有序的,此时插入点应该为i,即high+1,因为high==i-1
(2)对于折半插入,我们就是要在[0,i-1]之间寻找一个有效的插入点k,使得a[k-1]<=a[i]<a[k],即保证插入是稳定的。
(3)由于搜索区间是以2倍的速度不断递减,必然会有某一时刻出现:low == mid == high的情况,此时分两种情况:
a、若temp <a[mid],插入点在左边区间:high = mid-1;接着由于循环条件low<=high不满足而结束循环,此时temp 刚好比a[low]小,也就是说应该插入在low处。且满足low == mid == high+1
b、若temp>=a[mid],插入点在右边区间:low = mid +1;同样循环结束,此时temp刚好应该插入high点之后,且满足mid == high ==low-1
(4)综合两种情况,插入点都应该为high+1

参考书籍:
[1]《数据结构(C语言版)》严蔚敏
[2]《算法导论》第2版,潘金贵译

插入排序(Insertion Sort)相关推荐

  1. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

  2. C语言插入排序Insertion Sort算法(附完整源码)

    插入排序Insertion Sort算法 插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 插入排序Insertion Sort算法的完整源码(定义,实现,main函 ...

  3. C语言以递归实现插入排序Insertion Sort算法(附完整源码)

    以递归实现插入排序Insertion Sort算法 以递归实现插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 以递归实现插入排序Insertion Sort算法的完 ...

  4. python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

  5. [转载] python实现基本算法之插入排序(Insertion Sort)

    参考链接: Python中的插入排序insertion sort 基本算法之插入排序(Insertion Sort) 基本算法-02.插入排序(Insertion Sort)算法 冒泡排序已经发布,大 ...

  6. 插入排序(Insertion Sort)-Java实现

    插入排序(Insertion Sort)算法简介: 插入排序是一种丛序列左端开始依次对数据进行排序的算法.在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据. 插入排序(Inserti ...

  7. 插入排序Insertion sort 2

    原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分 ...

  8. LeetCode 147. Insertion Sort List 链表插入排序 C++/Java

    LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...

  9. Java实现插入排序及其优化 insertion sort

    本文带来八大排序算法之插入排序. 插入排序(Insertion Sort)属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的. 插入排序基本思想: 把n个待排序的元 ...

最新文章

  1. python随机生成30个8_Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例...
  2. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | strncat 函数 )
  3. java mvc 实际分层_SpringMVC体系分层模式原理图解
  4. linux lpte_linux常用命令
  5. 关于数字证书理解的简单整理以及12306站点证书简单分析
  6. maven 生成本地库_在2017年从Maven工件生成P2存储库
  7. 我们前端忙成狗 人家后端写sql?
  8. 7-10 找最小的字符串 (15 分)
  9. 教育部成立校外教育培训监管司 K12迎最强监管 教育中概股再跳水
  10. java循环输入_【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)...
  11. php装饰器模式 简书,装饰器模式/包装器模式
  12. [Java] ArrayList、LinkedList、Vector的区别
  13. 自己选择的路,不后悔
  14. 品尝阿里云容器服务:食用注意事项
  15. 全用户态网络开发套件F-Stack架构分析
  16. CV笔记5:图像分割之最大类间方差法、自适应阈值分割(基于python-opencv实现)
  17. 『2021最新~解决』The push refers to a repository [docker.io/
  18. 工作缺点和不足及措施_个人工作存在的不足和改进措施_个人工作存在问题和整改方案...
  19. TCP通信协议基本操作
  20. 用c++两个分数相加并且化简成最简形式,通过类来完成。思想是:求出两个数的最大公约数用来化简和求最大公倍数,具体公式代码中见

热门文章

  1. 一位北大才子的光棍节情诗
  2. Project:解决问题:在Microsoft project2016中如何编辑一周七天工作日
  3. python将经纬度标注在地图上_python读txt与写excel,将经纬度坐标点显示在地图上...
  4. 如何爬取新三板数据库(一)
  5. ThreeJs 学习之旅(十六)—Physics(物理)
  6. 记录一次teamview无法远程连接对方teamview的过程
  7. 域名证书(SSL)格式说明
  8. 知物由学 | SO VMP 加壳与混淆,为移动应用提供函数级保护
  9. 何为项目管理中的S曲线?
  10. 警告: 检测到依赖关系环:_软件设计:依赖关系