C++实现插入排序

来源:互联网 发布:淘宝店铺过户流程 编辑:程序博客网 时间:2024/06/16 18:50

最近学习到了插入排序。它不同于冒泡排序的地方,冒泡排序在每一趟中,一直在比较相邻的两个元素,有逆序对就交换,一次交换次数很多。然而插入排序是在第P趟时,前P个元素都是有序的,然后在第P趟时是给元素P+1找到合适的合适的位置,直接插入,交换次数少。两个相似的地方,但是时间效率来说,插入排序要好一些,特别是在待排序列比较有序的情况下,及逆序对少的情况下。但是对于冒泡,选择,插入这些方法,平均的时间都是二次的,因为它们都是对相邻的元素进行比较并进行调整。因此为了使一个排序算法以亚二次时间运行,必须执行一些比较,特别是对相距较远的元素进行交换。这样进行一次交换,就不止减少一个逆序对,而是多个,从而提高排序的时间效率。BTW:本质上来说,排序算法就是通过删除逆序对得以进行的。


记录一下今天的代码

#include<iostream>#include<vector>#include<random>#include<ctime>#include<iterator>#include<algorithm>using namespace std;/** 插入排序,从小到大*/template<typename T>void insertionSort(vector<T> & a){for (size_t p = 1; p < a.size(); ++p) // 从第二个数开始{T tmp = a[p];size_t j = p;for (; j > 0 && a[j-1] > tmp; --j)a[j] = a[j-1];a[j] = tmp;}}template<typename T>void printVector(vector<T> & v){copy(v.cbegin(), v.cend(), ostream_iterator<T>(cout, " "));cout << endl;}int main(){vector<int> source;uniform_int_distribution<int> u(0, 100);default_random_engine e(static_cast<unsigned int>(time(0)));for (int i = 0; i < 10; i++){source.push_back(u(e));}cout << "排序前:" << endl;printVector(source);insertionSort(source);cout << "排序后:" << endl;printVector(source);return 0;}

上面的代码给出了插入排序的函数模板,以及测试用例。

实现的过程中,并没有采用显式的交换,而是把第P趟的带排元素p+1复制给一个临时变量,然后把比它大的元素依次后移,直到它合适的位置找到,然后直接插入,减少了每次都要交换的时间。


结果如图



0 0