思路:先进行快速排序,当数据长度小于某个临界值后,都进行直接插入排序(high-low)<=Sp
需要注意的是每次排序完就要重置需要排序的数据,否则对于第一次已经排序完的数据,每个数据都是有序的,此时一定是Sp越大越快。
#include<iostream>
#include <time.h>
#include <windows.h>
#define M 2000
typedef struct{
double timeMIN;
int tp; //临界点
}Minsearch;
using namespace std;
void rand1(int a[])//随机数创建数组
{
int i;
srand((unsigned)time(NULL)); /*随机种子*/
for(i = 0; i < M; i ++)
a[i] = rand()%10000;
}
void DireInsSort(int a[], int low, int high)
{
int i,j;
int temp;
for(i=low+1; i<=high; i++)
{
temp=a[i];
j=i;
while(j>=low+1&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
}
void QuickSort1(int a[], int low, int high,int Sp)
{
int i,j;
int temp;
if((low+Sp)>=high){
DireInsSort(a,low,high);
return;
}
i=low;
j=high;
temp=a[i];
while(i<j)
{
while(i<j&&a[j]>temp) j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<=temp) i++;
if(i<j)
a[j--]=a[i];
}
a[i]=temp;
QuickSort1(a,++i,high,Sp);
QuickSort1(a,low,--j,Sp);
}
int main()
{
Minsearch q;
q.timeMIN=10;
double run_time;
_LARGE_INTEGER time_start; //开始时间
_LARGE_INTEGER time_over; //结束时间
double dqFreq; //计时器频率
LARGE_INTEGER f; //计时器频率
int b[M];
int a[M];
rand1(b);
//要重新赋值不然后果问题很大 ,因为已经排好了序号,
//无论排序长度多大都是直接插入排序最快,那时候就是n最大的时候最快,栓Q
//搞了半天
int Sp;
QueryPerformanceFrequency(&f);
dqFreq=(double)f.QuadPart;
for(Sp=0;Sp<=M;Sp+=1){
for(int i=0;i<M;i++)a[i]=b[i];
QueryPerformanceCounter(&time_start);
QuickSort1(a,0,M,Sp);
QueryPerformanceCounter(&time_over);
run_time=1000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;
if(run_time<q.timeMIN&&Sp!=0){
q.timeMIN=run_time;
q.tp=Sp;
}
//for(int i=0;i<M;i++)printf("%d ",a[i]);
printf("Sq为:%d ",Sp);
printf("运行时间为:%f\n",run_time);
}
printf("临界点Sq为:%d ",q.tp);
printf("最短运行时间为:%f\n",q.timeMIN);
return 0;
}