插入排序及其测试

插入排序

#include<iostream>
#include<algorithm>
#include<ctime>
#include<cassert> 

using namespace std;

template<typename T>
void insertionSort(T arr[],int n)// 插入排序 
{
	for(int i=1;i<n;i++)  /*从i=1,即从数组的第二个元素开始,直到最后一个元素(原因:要比较arr[1]与其前一个元素arr[0]大小。
							若从第一个元素i=0,即 arr[0]开始,前面没有可比较的对象) */ 
	{
		for(int j=i;j>0;j--)/*对于每一个元素,每次从j==i开始,与前一个元素比较,如果arr[j]比arr[j-1]小,就交换两个元素的位置,
							并且继续与其前一个元素比较,直到j-1==0,即其前一个元素为第一个元素arr[0]时,比较是否交换后终止。否则
							不交换并且跳出本次循环(因为这个元素已经处于合适位置了。)*/ 
		{
		 if(arr[j]<arr[j-1])
		    swap(arr[j],arr[j-1]);
		
		else 
		   break;         //跳出最近的一层循环 
		}
} 
}
int* generateRandomArray(int n,int rangeL,int rangeR) //随机生成数组里的各个元素值 
{	
	assert( rangeL<=rangeR);
	int * arr = new int[n];
	srand(time(NULL));
	for(int i=0;i<n;i++)
	{
		arr[i]=rand()%(rangeR-rangeL+1)+rangeL;
	}
	return arr;
}
/*****************************此性能测试函数详见以前博文***********************************************/
template<typename T>
bool isSorted(T arr[], int n)
{
	for(int i=0;i<n-1;i++)
	{
		if(arr[i]>arr[i+1])
		return false;
	}
	return true;
}

template <typename T>
void testSort( string sortName, void(*sort)(T[],int ), T arr[], int n)//测试函数,测试用的数组,测试数组的个数 
{
	clock_t startTime =clock();
	sort(arr,n);
	clock_t endTime =clock();
	assert(isSorted(arr,n));//断言assert,如果数组未被排序,则在此处终止程序。 
	cout<<sortName<<" : "<<double(endTime-startTime)/CLOCKS_PER_SEC<<" s"<<endl; //CLOCKS_PER_SEC 指的是每秒时钟运行周期的个数
	return ; 
}
/***********************************************************************************************************/
int main()
{
	int m=6000;
	int * arr=generateRandomArray(m,0,m);
	testSort("the first one:",insertionSort,arr,m );
	delete[] arr;
	return 0;
} 

发布了7 篇原创文章 · 获赞 6 · 访问量 6246

猜你喜欢

转载自blog.csdn.net/yuxing_miao/article/details/80086882