三种插入排序及其C++实现
来源:互联网 发布:上海行知小学 编辑:程序博客网 时间:2024/06/03 20:16
插入排序的基本方法是:每步将一个待排序的元素按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。
①直接插入排序
基本思想:当插入第i个元素时,前面的0~i-1个元素已经排好序,将第i个元素与前面元素依次比较,直至找到适合它的位置,插入并且其后的元素依次后移。
例子: 10 3 9 22 15 6
第一次排序: 3 10 9 22 15 6
第二次排序: 3 9 10 22 15 6
第三次排序: 3 9 10 15 22 6
第四次排序: 3 6 9 10 15 22
第四次排序的过程:
temp
3 9 10 15 22 6 -
3 9 10 15 22 22 6
3 9 10 15 15 22 6
3 9 10 10 15 22 6
3 9 9 10 15 22 6
3 6 9 10 15 22 6
每次将要插入的元素存到temp中,防止元素后移覆盖掉它,以升序为例,如果temp<前面元素,那么该元素后移,直至找到比temp小的元素,插入。 时间复杂度O(n²),排序结果稳定。
代码实现:
void InsertionSort (vector<int> & arr){ //升序 int n = arr.size(); int temp=0;int j=0; for(int i=1;i<n;i++) { temp = arr[i]; for( j=i-1;j>=0;j--) { if(temp<arr[j]) { arr[j+1]=arr[j]; } else { break; } } arr[j+1]=temp; }}②折半插入排序
折半插入排序是在直接插入排序的基础上的改良版,区别在于查找待插入元素的位置时采用二分查找,平均效率要高一些。时间复杂度O(n²),排序结果稳定。
代码:
void BinaryInsertionSort(vector<int> & arr){ //升序 int n = arr.size();int temp=0; int low=0,high=0,middle=0; for(int i=1;i<n;i++) { temp = arr[i]; low=0; high=i-1; while(low<=high) { middle = (low+high)/2; if(temp<=arr[middle]) high=middle-1; else low=middle+1; } for(int k=i-1;k>=low;k--)arr[k+1]=arr[k]; arr[low]=temp; }}③希尔排序(缩小增量排序)
基本思想:设待排序元素序列有n个元素,首先取一个整数gap<n作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放到同一个子序列中,在每一个子序列中分别施行直接插入排序。然后缩小gap,例如取gap=[gap/2],重复上述的子序列划分和排序工作。直到最后gap=1。希尔排序的时间复杂度很难确定,至今无人能够明确给出,同时它是一种结果不稳定的排序方法。
代码:
void ShellSort(vector<int> & arr){ //升序 int n = arr.size();int temp=0;int j; int gap = n-1; do { gap=gap/3+1; for(int i=gap;i<n;i++) { if(arr[i]<arr[i-gap]) { temp=arr[i]; j=i-gap; do{ arr[j+gap]=arr[j]; j=j-gap; } while(j>=0&&temp<arr[j]); arr[j+gap]=temp; } } } while(gap>1);}
阅读全文
0 0
- 三种插入排序及其C++实现
- C实现三种插入排序-简单插入排序、二分插入排序、希尔插入排序
- 直接插入排序的三种实现(c++)
- 插入排序三种实现
- 三种初级排序算法(冒泡、选择、直接插入)java实现及其性能比较
- 插入排序思想及其实现
- 三种排序算法的C语言实现--直接插入、希尔、堆排序
- 直接插入排序三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 直接插入排序的三种实现
- 插入排序C实现
- C实现插入排序
- 插入排序 C实现
- GraphicsMagick+im4java 图片处理
- iOS ProtocolBuffer 最新操作记录以及“'GPBProtocolBuffers_RuntimeSupport.h' file not found”等问题解决
- OpenCV Shi-Tomasi角点检测以及goodFeatureToTrack()源码分析
- java常用排序之希尔排序
- 百度地图点击城市的出现下钻
- 三种插入排序及其C++实现
- git版本管理软件——git日常管理代码
- 在MVC中实现MongoDB的分页查询
- Vue开篇杂谈--回首app开发模式
- jsp的四个作用域 page request session page
- 数组中的逆序对
- JavaScript学习总结(十八)——JavaScript获取浏览器类型与版本
- POJ-2955(区间DP)
- 基于jQuery和cropper点击头像上传并预览裁剪图片