C++实现插入排序

最近学习到了插入排序。它不同于冒泡排序的地方,冒泡排序在每一趟中,一直在比较相邻的两个元素,有逆序对就交换,一次交换次数很多。然而插入排序是在第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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值