排序算法之插入排序及其改进
2017-03-16 18:59
295 查看
另一个O(n^2)级别的算法:插入排序Insertion Sort
插入排序的过程:
插入排序的代码:
c++:
插入排序的改进:
一次交换三次赋值,把之前的每一次交换用赋值来取代,所以性能会更优。
改进后的代码:
进行排序的数组越接近有序,插入排序的性能就越优于选择排序。甚至超过O(nlgn)级别的排序算法。
而且插入排序更具实际意义,因为平时所处理的数据就是近乎有序的,比如系统日志(只是由于出错有几个无序的)。
当数组完全有序时,插入排序的时间复杂度为O(n)级别,因为内层循环每次都只执行一次就发现是最合适的位置,所以时间复杂度为n*1。
插入排序的过程:
插入排序的代码:
c++:
template<typename T> void InsertionSort(T arr[], int n){ /* for(int i = 1; i < n; i++){ for(int j = i; j > 0; j--){//和前一个元素比较,最后一次比较应该是j=1的时候和0的元素做比较,所以j>0 if(arr[j] < arr[j-1]) swap(arr[j],arr[j-1]);//c++ 11标准库中的内置函数,如果不是使用11标准,需要include algorithm else break; } } */ //另一种更为简洁的写法 for(int i = 1; i < n; i++){ for(int j = i; j > 0 && arr[j] < arr[j-1]; j--) swap(arr[j],arr[j-1]); } }
插入排序的改进:
一次交换三次赋值,把之前的每一次交换用赋值来取代,所以性能会更优。
改进后的代码:
template<typename T> void AdvanceInsertionSort(T arr[], int n) { for(int i = 1; i < n; i++) { T a = arr[i]; int j; for ( j = i; j > 0 && arr[j-1] > a; j--){ arr[j] = arr[j - 1]; } arr[j] = a; } } //另一种写法: template<typename T> void AdvanceInsertionSort(T arr[], int n){ //改进后的算法 for(int i = 1; i < n; i++){ T a = arr[i]; int j; for( j = i; j > 0; j--){ if(a < arr[j-1]){ arr[j] = arr[j-1]; } else break; } arr[j] = a; }
进行排序的数组越接近有序,插入排序的性能就越优于选择排序。甚至超过O(nlgn)级别的排序算法。
而且插入排序更具实际意义,因为平时所处理的数据就是近乎有序的,比如系统日志(只是由于出错有几个无序的)。
当数组完全有序时,插入排序的时间复杂度为O(n)级别,因为内层循环每次都只执行一次就发现是最合适的位置,所以时间复杂度为n*1。
相关文章推荐
- 排序算法(三)——插入排序及改进
- 排序算法(三)——插入排序及改进
- 排序算法的比较、选择及其改进
- 排序算法—比较排序之插入排序及其优化
- 排序算法之冒泡排序及其改进
- 排序算法之五--冒泡排序及其改进
- 排序算法(1) —— 直接插入排序及其改进
- 排序算法(1) —— 直接插入排序及其改进
- 基本排序算法(1)—插入排序及其变形shell排序
- 排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
- 排序算法--选择+冒泡及其改进
- 经典排序算法----直接插入排序算法及其改进
- 排序算法(三)——插入排序及改进
- 数据结构:冒泡排序及其改进、插入排序和希尔排序
- 排序算法(三)——插入排序及改进
- 排序算法(三)——插入排序及改进
- 排序算法1.插入排序 2.冒泡排序 3.改进的冒泡法 4.归并排序
- 深度剖析排序算法(一)——冒泡排序内涵及其改进方法。
- 排序算法(二)——插入排序
- 排序算法之插入排序