【问题标题】:Quick sort doesn't sort every time快速排序并非每次都排序
【发布时间】:2012-10-28 18:51:24
【问题描述】:

我的快速排序有问题。对于某些值,它有效,但对于其他值则无效。例如,当第一个值小于最后一个值时,它不起作用。我不知道出了什么问题。这是代码:

#include <stdio.h>
#include <time.h>

#define lenght_max 1000000
int x;
int tablica[lenght_max];
int q;

int Partition(left, right) {

    int tmp;
    int i;
    int j;

    i = -1;
    j = 0;

    x = tablica[right];
    i = left - 1;

    for(j = left; j < right; j++){
      if(tablica[j] <= x) {
        i++;
        tmp = tablica[i];
        tablica[i] = tablica[j];
        tablica[j] = tmp;
      }
    }

    return i + 1;
}

void Quicksort(left, right) {    
    if(left < right){ 
      q = Partition(left, right);
      Quicksort(left , q - 1);
      Quicksort(q + 1, right);
    }
}

int main(void) {

  int i;
  int temporary;
  int left;
  int right;

  printf("Witaj uzytkowniku. To jest program preferujacy sortowanie szybkie - quicksort.\n");
  printf("Podaj, ile liczb chcialbys posortowac: ");
  scanf("%i", &temporary);

  printf("Podaj liczby do sortowania: \n");

  for(i = 0; i < temporary; i++)
    scanf("%d", &tablica[i]);

    left = 0;
    right = temporary - 1;
    x = temporary / 2;

  Quicksort(left, right);

  printf("\nPROCES:\n");

  for(i = 0; i < temporary; i++)
    printf("%d\n", tablica[i]);

  return 0;
}

【问题讨论】:

  • 您的Partition() 方法可疑。您将枢轴设置为r+1 元素(记住数组从0 开始),并从p 迭代到r exclusive。这通常表示一个错误,但不熟悉的变量名称(为什么不使用英文?这几乎是惯例......)使其很难遵循。
  • 所以 r 是最后一个元素,p 是表中的第一个元素
  • 好的,我知道你现在在那里做了什么,第二次看起来还不错。不过,最好将变量名翻译成英文 - 每个人都更容易理解,而且您可能会得到更好的答案。
  • 我把我的代码翻译成英文名字

标签: c quicksort


【解决方案1】:

如果我没有忽略这个问题,在我看来,您似乎忘记将枢轴与第一个元素交换,而不是 Partition 末尾的枢轴。修复应该像添加一样简单:

    tmp            = tablica[i+1];
    tablica[i+1]   = tablica[right];
    tablica[right] = tmp;

在Partition 内的return i + 1; 语句之前。

【讨论】:

  • @henio180 我看到您从未接受任何问题的答案。假设这不是故意的,请阅读常见问题解答的以下part,最后解释了如何处理有用的答案。那么我建议你回去接受你之前问题中最有用的答案。
猜你喜欢
  • 2021-06-06
  • 2010-10-04
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多