插入排序 二分插入排序 学习
2012-05-12 14:49
253 查看
插入排序
基本思想:每次将待排序的记录按其建的大小插入到前面已经排好序的子序列中的适当位置。直到全部记录插入完成为止。
插入排序与打扑克牌时整理手中的牌非常相似。为了简化,可加入监视哨来加快速度。
表1-1 直接插入排序的时间复杂度
表1-1 直接插入排序的空间复杂度
由于有序区是顺序有序的,可以通过二分查找来确定插入位置,这种改进的插入排序就称为二分插入排序。
二分插入排序:
基本思想:每次将待排序的记录按其建的大小插入到前面已经排好序的子序列中的适当位置。直到全部记录插入完成为止。
插入排序与打扑克牌时整理手中的牌非常相似。为了简化,可加入监视哨来加快速度。
表1-1 直接插入排序的时间复杂度
初始状态 | 正序 | 反序 | 无序(平均) |
第i趟的键比较次数 | 1 | i | (i-2)/2 |
总的键比较次数 | n-1 | n(n-1)/2 | 约n^2/4 |
第i趟的记录移动次数 | 2 | i+2 | (i-2)/2 |
总的记录移动次数 | 2(n-1) | n(n-1)/2+2n | 约n^2/4 |
时间复杂度 | O(n) | O(n^2) | O(n^2) |
所需辅助空间是一个监视哨,空间复杂度为O(1)。是一个就地排序,是一种稳定的排序。 |
// insertsort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" void insert_sort(int a[], int n) { int i, j, temp; for (i = 1; i < n; ++i) { temp = a[i]; for (j = i; j>0 && temp < a[j - 1]; --j) { a[j] = a[j - 1]; } a[j] = temp; } }; int _tmain(int argc, _TCHAR* argv[]) { int a[]={46,58,15,45,90,18,10,62}; insert_sort(a,8); return 0; }
二分插入排序:
// binaryinsertsort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" void binary_insert_sort(int a[], int n) { int i, j, temp; int left,right,middle; for (i = 1; i < n; ++i) { temp = a[i]; left=0;right=i-1; while (left<=right) { middle=(left+right)/2; if (a[middle]>temp) { right=middle-1; } else { left=middle+1; } } for (int j=i-1;j>=left;j--) { a[j+1]=a[j]; } a[left]=temp; } }; int _tmain(int argc, _TCHAR* argv[]) { int a[]={46,58,15,45,90,18,10,62}; binary_insert_sort(a,8); return 0; }
相关文章推荐
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
- 数据结构-排序算法之插入排序(直接插入,二分插入,希尔,表插入)
- 内部排序之插入排序(直接插入排序,二分插入排序,希尔插入排序)
- C实现三种插入排序-简单插入排序、二分插入排序、希尔插入排序
- 直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
- Java使用二分插入排序竟然和直接插入排序速度相差不多
- 插入排序 二分查找插入排序
- Java学习-插入排序1-直接插入排序
- 插入排序优化:简单插入排序->二分查找插入排序->二路插入排序->shell插入排序
- 插入排序和二分插入排序
- 插入排序 二分插入排序
- 插入排序,二分插入排序,希尔排序思想与比较
- 可视化的排序五:插入排序、二分插入排序和希尔排序
- 插入排序——直接插入排序、二分插入排序、希尔排序
- 常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)
- Python使用二分插入排序竟然比直接插入排序快99倍!
- 插入排序-二分插入排序
- 三种常用的插入排序算法--直接插入排序、二分插入排序、希尔排序
- 排序算法之直接插入排序、二分插入排序和希尔排序
- 排序(二)插入排序、插入改进——二分插入排序、插入改进——希尔排序