#include <iostream> using namespace std; int Partition(int a[],int low,int high) //划分函数 { int i=low,j=high,b=a[low],t; //基准元素 while(i<j) { while(i<j&&a[j]>b) j--; //向左扫描 if(i<j) { t=a[i++]; a[i++]=a[j]; a[j]=t; } //两位交换后,i右移一位 while(i<j&&a[i]<=b) i++; //向右扫描 if(i<j) { t=a[j--]; a[j--]=a[i]; a[i]=t; } //两位交换后,j左移一位 } return i; //返回最终划分完成后基准元素所在的位置 } void Quicksort(int a[],int low,int high) { int mid; if(low<high) { mid=Partition(a,low,high); //返回基准 Quicksort(a,low,mid-1); //左区间递归 Quicksort(a,mid+1,high); //右区间递归 } for(int i=0;i<high;i++) cout<<a[i]; } int main() { int t,n; //测试例数,数据个数 cin>>t>>n; int a[n],low=0,high=n; for(int i=0;i<n;i++) cin>>a[i]; Quicksort(a,low,high); } 这段快速排序的代码有什么问题
时间: 2024-03-14 10:43:57 浏览: 50
这段快速排序代码存在以下问题:
1. 在主函数中定义数组a时,数组大小n是变量而不是常量,这在C++中是不被允许的。
2. 在Quicksort函数中,递归调用左右子区间时,应该是mid-1和mid+1而不是mid和mid+1,因为mid位置已经是基准元素了。
3. 在Quicksort函数中,应该在判断low<high之后再进行递归调用,否则会出现栈溢出的情况。
4. 在Quicksort函数中,应该在递归调用前判断low<high,否则会出现无限递归的情况。
5. 在最后输出排序后的数组时,应该输出到high而不是n。
6. 在Partition函数中,基准元素应该是a[low]而不是b。
7. 在Partition函数中,两次交换元素时,应该是a[i++]=a[j]和a[j--]=t而不是a[i++]=a[j]和a[j--]=a[i]。
修改后的代码如下:
```
#include <iostream>
using namespace std;
int Partition(int a[], int low, int high) //划分函数
{
int i = low, j = high, b = a[low], t; //基准元素
while (i < j)
{
while (i < j && a[j] > b) j--; //向左扫描
if (i < j)
{
t = a[i];
a[i++] = a[j];
a[j] = t;
} //两位交换后,i右移一位
while (i < j && a[i] <= b) i++; //向右扫描
if (i < j)
{
t = a[j];
a[j--] = a[i];
a[i] = t;
} //两位交换后,j左移一位
}
return i; //返回最终划分完成后基准元素所在的位置
}
void Quicksort(int a[], int low, int high)
{
if (low < high)
{
int mid = Partition(a, low, high); //返回基准
Quicksort(a, low, mid - 1); //左区间递归
Quicksort(a, mid + 1, high); //右区间递归
}
}
int main()
{
int t, n; //测试例数,数据个数
cin >> t >> n;
int a[n], low = 0, high = n - 1;
for (int i = 0; i < n; i++)
cin >> a[i];
Quicksort(a, low, high);
for (int i = 0; i <= high; i++)
cout << a[i] << " ";
return 0;
}
```
阅读全文