【问题标题】:quick sort not working returning same array快速排序不起作用返回相同的数组
【发布时间】:2020-08-16 17:05:42
【问题描述】:

Part 方法没有做任何事情,它输出与输入相同的数组,我不知道出了什么问题

void part(int array[100], int start, int end){
  int pivot = array[start];
  int i = start;
  int j = end;
  int temp, temp2;
  // i to swap elements greater than pivot
  // j to swap elements less than or equal to pivot
  while(i > j){
    while(true){
      if(array[i] <= pivot ){
        break;
      }
      ++i;
    }
    while(array[j] > pivot){
      if(array[j] > pivot){
        break;
      }
      --j;
    }
    if(i < j){
      temp = array[i];
      array[i] = array[j];
      array[j] = temp;
    }
  }
  if(j < i){                                    // j - i cross each other
    temp2 = pivot;
    pivot = array[j];
    pivot = temp2;
  }

  for(int k = 0; k<end;++k){
    cout<<array[k];
  }


}

void quick(int array[100], int start, int end){
  if(start < end){
    part(array, start, end);
  }


}

【问题讨论】:

  • 如何使用quickpart?请发布Minimal, Reproducible Example。注意循环体while(i &gt; j)不会在start &lt;= end时执行。
  • 当您使用调试器运行程序时,您看到了什么?这正是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用它来一次运行您的程序、监控所有变量及其值的变化以及分析程序的逻辑执行流程的好机会。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
  • 快速方法仅用于递归调用部分,部分必须对数组进行排序
  • 另请注意,您的程序看起来很危险,因为循环中的i 没有限制while(true)array[i] 可能会超出范围。如果end 在范围内,则while(array[j] &gt; pivot) 循环是安全的,因为当array[j] &gt; pivot 时循环被中断(与循环条件相同!)
  • 我之前使用的是相同的版本,但我做了一些改变,哈哈

标签: c++ array-algorithms


【解决方案1】:

只有在

if(start < end){
    part(array, start, end);

但你会这样做

int i = start;
int j = end;

while(i > j){

因此,预计这将无济于事。 while 永远不会进入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2014-04-18
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多