插入排序(Insertion Sort)
维基百科:http://zh.wikipedia.org/wiki/插入排序
算法思想:
若数组A[n]的前n-1个数已经有序,我们只需把第n个元素插入到适当的位置即可。易分析得算法的时间复杂度为Ο(n^2)
具体描述:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤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)相关推荐
- python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- C语言插入排序Insertion Sort算法(附完整源码)
插入排序Insertion Sort算法 插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 插入排序Insertion Sort算法的完整源码(定义,实现,main函 ...
- C语言以递归实现插入排序Insertion Sort算法(附完整源码)
以递归实现插入排序Insertion Sort算法 以递归实现插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 以递归实现插入排序Insertion Sort算法的完 ...
- python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- [转载] python实现基本算法之插入排序(Insertion Sort)
参考链接: Python中的插入排序insertion sort 基本算法之插入排序(Insertion Sort) 基本算法-02.插入排序(Insertion Sort)算法 冒泡排序已经发布,大 ...
- 插入排序(Insertion Sort)-Java实现
插入排序(Insertion Sort)算法简介: 插入排序是一种丛序列左端开始依次对数据进行排序的算法.在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据. 插入排序(Inserti ...
- 插入排序Insertion sort 2
原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分 ...
- LeetCode 147. Insertion Sort List 链表插入排序 C++/Java
LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...
- Java实现插入排序及其优化 insertion sort
本文带来八大排序算法之插入排序. 插入排序(Insertion Sort)属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的. 插入排序基本思想: 把n个待排序的元 ...
最新文章
- shell编程系列7--shell中常用的工具find、locate、which、whereis
- 英文书也没有那么难,跟着例子做,挺有意思的
- 使用Devstack部署neutron网络节点
- ncnn windows
- docker ppt
- gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
- 互联网十几年 我们错失了哪些创业机会
- pdg快速转换pdf源码_在手机上快速免费把图片转换成PDF文件
- Swift数据类型简介
- SqlServer导出为mdf
- 编译opencv3.1.0时报错unable to find a javc compiler
- 微信群控,微信云控系统源码之uiautomator框架介绍
- C#实战010:Excel操作-查询Excel中的数据
- chunxunnet
- python数据分析实训报告总结_Python实训周总结(精品文档)
- 逻辑英语——动词和分词-----名词
- 0基础学3dmax建模难吗?
- centOS7的vi中如何使用汉语拼音和五笔
- python实现Excel多行多列的转换
- php接口链接浏览器打开很快php很慢,php不管curl还是file_get_contents请求接口都很慢,但直接在浏览器里访问就很快,这是说明情况?...