c - C问题中的快速排序
问题描述
我在 C 中的快速排序程序中被困在某个点上。有人能指出错误在哪里吗?我的代码没有运行,我尝试将它与多个在线程序进行比较。我明天有一个测试,我想在尝试之前知道错误是什么。
#include <stdio.h>
void swap(int a,int b){
int t;
t=a;
a=b;
b=t;
}
int partition(int a[],int l,int h){
int pi=l,i=l,j=h;
while(i<j){
while(a[i]<=a[pi])
i++;
while(a[j]>a[pi])
j--;
if(i<j){
swap(a[i],a[j]);
}
}
swap(a[j],a[pi]);
return j;
}
void quicksort(int a[],int l,int h){
int j;
j=partition(a,l,h);
quicksort(a,l,j-1);
quicksort(a,j+1,h);
}
int main(){
int n,i;
printf("Enter the number of elements: ");
scanf("%d",&n);
int a[n];
printf("Enter the elements: ");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
quicksort(a,0,n-1);
printf("The array after sorting is: ");
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return 0;
}
解决方案
您的代码有几个问题。
首先,您的交换函数交换局部变量a
和b
,但不会影响a
. partition
Ian Abbott 对此进行了更彻底的解释。
解决这个问题的一种方法是通过指针传递数组元素的地址,以便swap
可以访问和更改它们。一种更简单的方法是编写一个对数组索引进行操作的交换函数:
void swap(int array[], int i, int j)
{
int t = array[i]; array[i] = array[j]; array[j] = t;
}
其次,必须在某个时间停止递归。当你有一个只有一个元素或根本没有元素的数组时,没有什么可做的,因为数组(或子数组)已经排序。
所以在这种情况下不要做任何事情。或者,更确切地说,只有当你至少有两个元素时才做某事。这具有很好的副作用,即 recursion 实际上停止了。:)
void quicksort(int a[], int l, int h)
{
if (l < h) {
int j;
j = partition(a, l, h);
quicksort(a, l, j - 1);
quicksort(a, j + 1, h);
}
}
推荐阅读
- c++ - 使用 g++ 找不到 libintl.h 文件以获取 vertica 指令
- sql - 查找每行的最大列名和值
- python - 在模块级别或类内定义列表
- python-3.x - Matplotlib 动态 Y 轴基于列表中的最小值
- reactjs - 首次上传后 FineUploader 不工作
- python - 将一个df中的每一列除以Python中另一个df中的每一列
- java - 运行 jre keytool 导致 Permission Denied 错误
- django - 使用 Amazon Redshift 对使用 Postgresql 作为数据库的 Django 应用程序进行分析
- ios - 如何将相机指向 iOS 11 以下的 SCNVector3 点
- reactjs - 如何使用 React 获取查询字符串?