插入排序-InsertSort
2015-08-28 11:25
274 查看
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
插入排序步骤:
1.在有序序列中查找插入点
2.从插入点开始向后移动数据(1、2可合并,边查找边移动数据)
3.插入数据
插入排序根据查找插入点方法不同分为:直接插入排序和二分插入排序。
时间复杂度:O(n^2)
时间复杂度:查找插入点需要Θ(log i)比较;移动数据最多移动i+1次,最少2次。(查找插入点开销减少了,但是对没有减少总开销数量级)
所以时间复杂度:还是O(n^2)
两种插入排序是稳定的排序。
插入排序步骤:
1.在有序序列中查找插入点
2.从插入点开始向后移动数据(1、2可合并,边查找边移动数据)
3.插入数据
插入排序根据查找插入点方法不同分为:直接插入排序和二分插入排序。
代码
直接插入排序:
class InsertSort { public: void insertSort(vector<int> &nums){ int length=nums.size(); int i,j,tmp; for(i=1;i<length;i++){ tmp=nums[i]; for(j=i-1;j>=0 && tmp<nums[j];j--){ //tmp比较必须合并到j>=0 nums[j+1]=nums[j]; } nums[j+1]=tmp; } } };
时间复杂度:O(n^2)
二分插入排序:
查找插入点时,使用二分查找。class BinarySearchInsertSort{ public: void binarySearchInsertSort(vector<int> &nums){ int length=nums.size(); int i,j,p,value; for(i=1;i<length;i++){ value=nums[i]; p=binarySearchInsertPosition(nums,i,value); for(j=i;j>p;j--){ nums[j]=nums[j-1]; } nums[j]=value; } } int binarySearchInsertPosition(vector<int> &nums,int length,int value){ int low=0,high=length-1,mid; while(low<=high){ mid=low+(high-low)/2; if(value<nums[mid]){ high=mid-1; }else{ low=mid+1; //当value>=nums[mid],low=mid+1,保证排序稳定性 } } return low; //返回low } };
时间复杂度:查找插入点需要Θ(log i)比较;移动数据最多移动i+1次,最少2次。(查找插入点开销减少了,但是对没有减少总开销数量级)
所以时间复杂度:还是O(n^2)
两种插入排序是稳定的排序。
相关文章推荐
- 插入排序
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C#折半插入排序算法实现方法
- SQL进行排序、分组、统计的10个新技巧分享
- C++实现位图排序实例
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)
- php实现插入排序
- PHP下对数组进行排序的函数