【问题标题】:QuickSort Algorithm in C [closed]C中的快速排序算法[关闭]
【发布时间】:2014-05-12 19:47:28
【问题描述】:

我正在尝试为快速排序算法编写递归程序。到目前为止,这是我的代码:

void QuickSort(int *array, int first, int last){
  int q;
  if (first<last){
    q = partition(array,first,last);
    QuickSort(array,first,q-1);
    QuickSort(array,q+1,last);
  }
}

void partition(int *A, int p, int r){
  int value = A[r];
  i = p-1;
  int tmp;
  for (j = p; j<=r; j++){
    if (A[j] <= value) {
      i++;
      tmp = A[i];
      A[i] = A[j];
      A[j] = tmp;
    }
  }
return(i);
}

int main(){                                                                            
  int numArray[8] = {30,15,11,40,75,80,70,60};
  int i;

  printf("Before sorting: \n");
  for (i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);

  int first = 0;
  int last = sizeof(numArray)/sizeof(numArray[0]);
  QuickSort(numArray,first,last-1);

  printf("After sorting: \n");
  for (i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);
}

我的问题是,当我运行它时,当我到达第一个递归调用时(就在分区之后),我陷入了无限循环。另外,我注意到递归调用是在 A[0] - A[5] 的数组值上运行的,即使它应该在 A[0]-A[3] 上。我并不期待一个完整的答案,但也许关于程序为什么会陷入无限状态的提示会非常有帮助。

【问题讨论】:

  • 代码有很多错误导致无法编译。一旦这些被修复,代码对我有用。一个有趣的解决方法是将partition 更改为返回int 而不是void
  • 我的评论实际上是从头开始遍历整个数组,而枢轴实际上是数组中的最后一个数字。我明白你在说什么,但我们(作为我大学的算法课)只是从头开始工作,而不是像你建议的那样从数组的两端开始
  • 我的意思是说“代码”而不是上面的“评论”
  • @user3342662 - 不要编辑帖子的重要原始内容。当其他人试图解决一个问题时,它会混淆事情,然后突然间你所说的问题已经改变或消除了。
  • @ryyker 我所做的唯一更改是在 main() 函数中声明“int i”,因为下面的一位用户说它未声明,而在我的程序中我实际上将“i”声明为一个全局变量。否则,代码保持不变。所以,作为对你的评论的回应,我真的不知道大惊小怪是什么。

标签: c algorithm recursion quicksort


【解决方案1】:

这是我对你的大纲所做的,它似乎工作和排序都很好。 我用 int 替换了 void,并根据需要声明了 int

#include<iostream>
using namespace std;


int partition(int *A, int p, int r){
    int value = A[r];
    int i = p-1;
    int tmp;
    for (int j = p; j<=r; j++){
        if (A[j] <= value) {
        i++;
        tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
        }
   }
return(i);
}
void QuickSort(int *array, int first, int last){
    int q;
    if (first<last){
        q = partition(array,first,last);
        QuickSort(array,first,q-1);
        QuickSort(array,q+1,last);
    }
}



int main(){
    int numArray[8] = {30,15,11,40,75,80,70,60};

    printf("Before sorting: \n");
    for (int i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);

    int first = 0;
    int last = sizeof(numArray)/sizeof(numArray[0]);
    QuickSort(numArray,first,last-1);

    printf("After sorting: \n");
    for (int i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多