zoukankan      html  css  js  c++  java
  • 排序算法总结(一)插入排序【Insertion Sort】

    最近在忙着找工作,以前看的排序算法都忘记了,悲剧啦T  T现在来回顾一下吧。

    这边推荐一个算法可视化的网站,非常有用。http://visualgo.net/

    一.插入排序的思想(Wikipedia):

      它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    1. 从第一个元素开始,该元素可以认为已经被排序
    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
    3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    5. 将新元素插入到该位置后
    6. 重复步骤2~5

    Tips:如果比较操作的代价比交换操作大的话,可以采用二分查找来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找插入排序。

    二:过程

    原始数据

    如下图所示,第一个数设为已排序完成的数,此时将需要排序的数往前进行比较,如果已排序的数(11)大于改元素(5),则将已排序的数后移一位(11),直到找到比自己(5)小的数或则到达数组的头部。

     

    重复上述过程

    三.代码

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <typename T>
    void InsertionSort( vector<T> &nums){
    	for( int i = 1; i < nums.size(); i++ ){
    		T temp = nums[i];
    		int j;
    		for( j = i-1; j >= 0 && nums[j] > temp; j-- ){
    			nums[j+1] = nums[j]; //对应3
    		}
    		nums[j+1] = temp; //4.5
    	}
    }
    
    int main(){
    	vector<int> nums{11,5,29,1,34,4,12,24,40,5,35,17};
    	cout<<" Before Sort:" ;
    	for( auto m: nums){
    		cout <<  m <<" ";
    	}
    	cout<<endl;
    	InsertionSort( nums );
    	cout<< " After Sort:";
    	for( auto m: nums){
    		cout  << m <<" ";
    	}
    	cout<<endl;
    }
    

    四.总结

    1.首先插入排序是一种稳定的排序

    2.对于最好的情况,即原数据是已排序的,则插入排序一共只需要进行n-1次的比较操作

    3.对于最坏的情况,即数据是降序的,在这种情况下,一共需要进行1+2+3....(n-1)即n(n-1)/2次比较操作和n(n-1)/2 + (n-1)次赋值操作,所以总的时间复杂度是O(n2)

    4.在C++的STL中,插入排序作为快排的补充,用于少量元素的排序,通常为8个或以下。

  • 相关阅读:
    測试AtomicInteger与普通int值在多线程下的递增操作
    《漫画线性代数》读书笔记 矩阵
    Android下雪动画的实现
    Live555实战之交叉编译live555共享库
    JAVA_SE基础——24.面向对象的内存分析
    Linux下利用signal函数处理ctrl+c等信号
    tomcat6url请求400错误(%2F与%5C)
    python的交互式shell-ipython体验
    1906月读书清单
    Linux对变量的截取替换
  • 原文地址:https://www.cnblogs.com/rockwall/p/5740702.html
Copyright © 2011-2022 走看看