插入排序和歸併排序實現

在文章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");
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章