优化冒泡排序对降序数组排序耗时与升序相近是否正常
问题结论
该现象不属于正常情况,是测试代码存在多处逻辑错误,导致测试用例不符合预期才出现的结果。
错误原因
- 快排逻辑与调用错误
你实现的quickSort本身是升序排序逻辑,你调用它的目的是得到降序数组,需求和代码功能完全相反。同时快排调用参数存在越界问题:长度为n的int数组合法下标范围是[0, n-1],但你代码中写的是quickSort(tab, 0, n),会触发数组访问越界,属于C语言未定义行为。 - 测试用例不符合预期
在越界未导致程序崩溃的前提下,你调用快排后实际得到的还是升序数组,传入冒泡排序的仍然是最优场景的升序输入,自然一轮遍历无交换就直接退出,和直接测试升序数组的耗时几乎一致。 - 内存申请写法不规范
你申请数组的语句tab = (int*)malloc(n * sizeof(int*));存在错误,应该改为sizeof(int),你写的int*是指针类型的大小,虽然本次测试不会影响数组内容,但属于错误的内存申请写法。
修复方案
- 修正快排调用参数为
quickSort(tab, 0, n-1) - 快排升序排序完成后,新增代码反转数组得到降序输入,示例代码如下:
for(int i=0; i<n/2; i++){ int temp = tab[i]; tab[i] = tab[n-1-i]; tab[n-1-i] = temp; }
- 修正内存申请语句为
tab = (int*)malloc(n * sizeof(int)); - 调整后重新测试,降序数组作为输入时,优化冒泡排序的耗时为O(n²)量级,和升序场景的O(n)耗时会有非常显著的差距,数组长度n越大,差距越明显。
内容的提问来源于stack exchange,提问作者Mr_t
相关产品推荐
相关产品推荐

