C语言:将快速排序与直接插入排序结合

思路:先进行快速排序,当数据长度小于某个临界值后,都进行直接插入排序(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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值