18-比较快排和冒泡排序的效率

Q:比较快排和冒泡排序的效率
结论:快排的效率比冒泡高的多的多

在这里插入图片描述

代码:

int Cmp_int(const void *vp1,const void *vp2)//定义排序的方式,标准写法
{
	return *(int *)vp1-*(int *)vp2;//强转再解引用
}

void BubbleSort(int *arr,int len)
{
	int tmp;
	for(int i=0;i<len-1;i++)
	{
		for(int j=0;j+1<len-i;j++)
		{
			if(arr[j] > arr[j+1])
			{
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}
}

//利用快速排序测试效率
//快排的效率比冒泡的效率高的多
int main()
{
	int *arr = (int *)malloc(NUM*sizeof(int));
	int *brr = (int *)malloc(NUM*sizeof(int));
	assert(arr != NULL && brr != NULL);
	srand(time(NULL));//必须放在外面,不能放在循环里面
	for(int i = 0;i<10;i++)
	{
		for(int j = 0;j<NUM;j++)
		{
			srand(time(NULL));//error
			brr[j] = arr[j] = rand()*rand();
		}
		clock_t c1 = clock();
		qsort(arr,NUM,sizeof(int),Cmp_int);//函数调用
		clock_t c2 = clock();
		printf("第%d次快排:%d ms",i+1,c2-c1);
		c1 = clock();
		BubbleSort(brr,NUM);
		c2 = clock();
		printf("第%d次冒泡:%d ms",i+1,c2-c1);
		printf("\n");
	}

	return 0;
}
如果是对double类型的数组进行快排
不能像对int类型一样,直接返回return *(int )vp1-(int *)vp2;因为如果double类型为11.1和11.2,那么相减的结果为0,与小于0不符
int Cmp_double(const void *vp1,const void *vp2)
{
	double tmp = *(double *)vp1 - *(double *)vp2;
	if(tmp>0)
	{
		return 1;
	}
	else if(tmp < 0)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

int main()
{
	double arr[] = {11.1,22.2,33.3,44.4,55.5,66.6};
	qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(double),Cmp_double);
	for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		printf("%lf\n", arr[i]);
	}
	
	return 0;
}
知识点:
1.快排的标准模板:
void qsort(void *num,size_t number,size_t width,int (__cdcl *compare)(const void ,const void))
例:qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),Cmp_int)
int Cmp_int(const void *vp1,const void *vp2)
{
return *(int )vp1-(int *)vp2;//强转再解引用
}
2.qsort()函数包含在stdlib.h头文件
3.对int类型和对double类型进行快排,排序条件的返回值不一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值