维基百科: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. shell编程系列7--shell中常用的工具find、locate、which、whereis
  2. 英文书也没有那么难,跟着例子做,挺有意思的
  3. 使用Devstack部署neutron网络节点
  4. ncnn windows
  5. docker ppt
  6. gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
  7. 互联网十几年 我们错失了哪些创业机会
  8. pdg快速转换pdf源码_在手机上快速免费把图片转换成PDF文件
  9. Swift数据类型简介
  10. SqlServer导出为mdf
  11. 编译opencv3.1.0时报错unable to find a javc compiler
  12. 微信群控,微信云控系统源码之uiautomator框架介绍
  13. C#实战010:Excel操作-查询Excel中的数据
  14. chunxunnet
  15. python数据分析实训报告总结_Python实训周总结(精品文档)
  16. 逻辑英语——动词和分词-----名词
  17. 0基础学3dmax建模难吗?
  18. centOS7的vi中如何使用汉语拼音和五笔
  19. python实现Excel多行多列的转换
  20. php接口链接浏览器打开很快php很慢,php不管curl还是file_get_contents请求接口都很慢,但直接在浏览器里访问就很快,这是说明情况?...

热门文章

  1. 优质百度网盘资源分享(计算机篇)
  2. 基于TIVA库函数的TM4C1294XL使用笔记|TI单片机
  3. java get/set方法好处
  4. html使三角形渐变色,CSS3 简单的三角形渐变效果
  5. 西门子plc怎样实现远程调试、远程上下载程序?
  6. pstate0 vid数值意义_光行差成因和物理意义新解及其验证方法
  7. 深度推荐模型 -NFM
  8. python 数据处理时去除emoji表情
  9. 笔记本处理器排名_【笔记本】AMD YES,霸占性能排行榜前四
  10. 利用天翎知识文档+群晖NAS搭建企业知识库,享用智能检索