插入排序
#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;
}