插入排序和归并排序实现

在文章http://blog.csdn.net/zhongkelee/article/details/44490315的基础上,利用c++中的vector容器代替数组来实现,但是发现这样做大大的增加了程序运行的时间,并且两者的运行时间几乎差不多

改写的程序
#include <iostream>
#include <vector>
#include"stdio.h"
#include <time.h>
#include <assert.h>
using namespace std;
//插入排序
vector<int> InsertSort(vector<int> ptr)
{
	int key;
	for (int i=1;i<ptr.size();i++)
	{
		key=ptr[i];
		int j=i-1;
		while (j>=0&&ptr[j]>key)
		{
			ptr[j+1]=ptr[j];
			j--;
		}
		ptr[j+1]=key;
	}
	return ptr;
}
//对已经排列子序列合并
void Merge(vector<int>*ptr,int begin, int end,int mid )
{
	int imax=numeric_limits<int>::max();
	vector<int>left,right;
	//使用哨兵位
	int left_size=mid-begin+1;
	int right_size=end-mid;
	for (int i=0;i<left_size;i++)
	{
		left.push_back(ptr->data()[begin+i]);
	}
	left.push_back(imax);
	for (int i=0;i<right_size;i++)
	{
		right.push_back(ptr->data()[mid+1+i]);
	}
	right.push_back(imax);

	int i=0,j=0;
	for (int k=begin;k<=end;k++)
	{
		if(left[i]<=right[j])
			ptr->data()[k]=left[i++];
		else
			ptr->data()[k]=right[j++];
	}
}
//归并排序子序列排序操作
void MergeSort(vector<int> *ptr,int begin,int end){
	if (begin>=end)
		return;
	int mid=(begin+end)/2;
	MergeSort(ptr,begin,mid);
	MergeSort(ptr,mid+1,end);
	Merge(ptr,begin,end,mid);
}

//输出容器整数
void Output(vector<int> ptr){

	for (int i=0;i<ptr.size();i++)
	{
		cout<<ptr[i];
		cout<<",";
	}
	cout<<endl;
}

int main()
{const int TEST_NUM=100000;//测试数据的个数
	vector<int> a;
	vector<int> sort_a;
	srand((int)time(NULL));//以当前时间对应的int值为随机序列起点
	for (int i=0;i<TEST_NUM;i++)
	{
		a.push_back(rand());//产生随机数
	}
	cout<<"Test number: "<<TEST_NUM<<endl;
	clock_t t=clock();
	sort_a=InsertSort(a);
	cout<<"InsertSort Time:"<<clock()-t<<endl;

	vector<int>*ptr=&a;
	MergeSort(ptr,0,TEST_NUM-1);
	cout<<"MergeSort Time:"<<clock()-t<<endl;
	//sort_a=MergeSort(a,0,3);
	for (int i=0;i<10;i++)//判断是否正确排序
	{
		assert(a[i]==sort_a[i]);
	}
	cout<<"sort done!"<<endl;
	system("pause");
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值