c++ - 如何打印出 QuickSort 切换和检查的次数?
问题描述
我有这个任务,我必须对快速排序算法进行研究,并且我必须测量该算法检查数字(if 语句)并切换它们的时间。之后我需要打印出 2 个变量来显示检查和切换数字的次数。我认为我遇到了问题,因为我使用的是递归函数,但我想不出更好的方法来编写代码。
void quickSort(int* arr, int low, int high, int checks, int switches){
switches++;
int i = low;
int j = high;
int temp;
int pivot = arr[(i + j) / 2];
checks++;
while (i <= j)
{
checks++;
while (arr[i] < pivot)
i++;
checks++;
while (arr[j] > pivot)
j--;
checks++;
if (i <= j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
checks++;
if (j > low) {
quickSort(arr, low, j, checks, switches);
}
checks++;
if (i < high) {
quickSort(arr, i, high, checks, switches);
}
cout << checks<<" "<<switches << endl;
}
我在两个 if 之后都打印了检查和开关变量,但是数字被打印了几次(如果数组很大,例如 arr[400] 这些数字会被打印很多次)。我试图使快速排序函数成为一个 INT 函数并将这些变量返回给 main,然后将它们打印出来,但我的尝试没有成功。我还尝试编写另一个 if 语句if(j< low && i>high) {cout << checks<<" "<<switches << endl;}
,但它不会打印。
任何关于如何改进我的代码的帮助或有用信息都将受到赞赏。
先感谢您。
解决方案
- Make
checks
和switches
全局变量。
while (arr[i] < pivot)
i++;
checks++;
这不应该是
while (arr[i] < pivot) {
i++;
checks++;
}
checks++;
感谢@NateEldridge 指出最后一个终止循环的检查也必须被计算在内,因此checks++
在最后。
3.
if (i <= j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
在此代码中,您正在交换arr[i]
,arr[j]
因此您应该更新switches
.
- 在某些地方,您
checks
似乎switches
无缘无故地更新;看来你应该只更新andchecks
。arr[i] < pivot
arr[j] > pivot
推荐阅读
- javascript - 不能让这个简单的函数返回任何东西
- python - AttributeError:模块“numpy”没有属性“__version__”
- python - Python:从命令行运行具有相对路径的脚本
- c# - 使用代码创建 DataTable 并将其添加到 DataGridView c#
- excel - Excel:比较 2 列,计数和返回值第 3 列
- c++ - QT MySql 数据库检查登录名和密码以登录
- angularjs - $compile()'d 锚状态导致完整的浏览器重新加载而不是 angularjs 中的状态更改
- vb.net - 将列表保存到 My.Settings
- c# - 当重载方法可用时,为什么 C# 选择 int 和 double 而不是其他数据类型?
- java - 我可以将 org.eclipse.jdt.core 导入 Netbeans 吗?