如何将C风格堆排序程序转换为使用C++标准容器(如std::vector)
把C风格堆排序转换为C++ std::vector实现的完整指南
嘿,很高兴帮你把C风格的堆排序迁移到C的std::vector上!你已经找准了核心问题——换掉C的VLA,接下来咱们把剩下的细节调整好,让代码完全适配C的标准容器:
关键修改点
1. 函数参数替换为std::vector引用
原来的函数参数int a[]本质是指针,换成std::vector<int>&才能直接操作原容器,避免不必要的拷贝,还能保证修改生效。比如:
- 把
void MaxHeapify(int a[], int i, int n)改成void MaxHeapify(vector<int>& a, int i, int n) HeapSort和Build_MaxHeap的参数也要做同样修改
2. 保留原逻辑的索引习惯(可选但省心)
你的代码用了1-based索引(从1开始存数据,索引0闲置),std::vector默认是0-based,但完全可以兼容这个习惯——只要初始化时给足空间就行。比如原来的int arr[n](n已经自增过),换成vector<int> arr(n);,这样索引0到n-1的空间都可用,和你原来的逻辑完美匹配,不用大改索引计算。
3. 补充必要的头文件
std::vector属于C++标准库,必须包含<vector>头文件才能使用,不然编译器会报错。
4. 移除冗余的返回语句
MaxHeapify是void类型函数,执行到末尾会自动返回,里面的return;属于冗余代码,可以删掉让代码更简洁。
修改后的完整代码
#include<iostream> #include<vector> // 必须包含的vector头文件 using namespace std; // 堆化函数:改用vector引用参数 void MaxHeapify(vector<int>& a, int i, int n) { int j, temp; temp = a[i]; j = 2*i; while (j <= n) { if (j < n && a[j+1] > a[j]) j = j+1; if (temp > a[j]) break; else if (temp <= a[j]) { a[j/2] = a[j]; j = 2*j; } } a[j/2] = temp; } // 堆排序函数:改用vector引用参数 void HeapSort(vector<int>& a, int n) { int i, temp; for (i = n; i >= 2; i--) { temp = a[i]; a[i] = a[1]; a[1] = temp; MaxHeapify(a, 1, i - 1); } } // 构建最大堆函数:改用vector引用参数 void Build_MaxHeap(vector<int>& a, int n) { int i; for(i = n/2; i >= 1; i--) MaxHeapify(a, i, n); } int main() { int n, i; cout<<"\nEnter the number of data element to be sorted: "; cin>>n; n++; // 为1-based索引预留位置 vector<int> arr(n); // 替换VLA为vector for(i = 1; i < n; i++) { cout<<"Enter element "<<i<<": "; cin>>arr[i]; } Build_MaxHeap(arr, n-1); HeapSort(arr, n-1); cout<<"\nSorted Data "; for (i = 1; i < n; i++) cout<<"->"<<arr[i]; cout<<"\nTime Complexity: Best case = Avg case = Worst case = O(n logn)"; return 0; }
额外小提示
如果之后想改成更符合C++容器习惯的0-based索引,只需要调整循环的起始/结束条件,以及堆化时的子节点计算(比如把左子节点改成2*i+1,右子节点改成2*i+2),不过你的原逻辑用1-based完全没问题,不用强行修改。
内容的提问来源于stack exchange,提问作者Ranu Singh
相关产品推荐
相关产品推荐

