快速排序实现,找不到错误

Posted

技术标签:

【中文标题】快速排序实现,找不到错误【英文标题】:Quicksort implementation, can't find error 【发布时间】:2011-04-13 13:55:44 【问题描述】:

我想用一些不同的枢轴策略来实现这个快速排序算法,但其中存在一些逻辑错误。你能帮我找到吗?

#include <iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
int arr[100],i,pivot,left,right,sum=0,a,n=10;

int partition();
void quickSort(int* ,int ,int );



void main()

    clrscr();
    int i,n=20;
    for(i=0;i<=n;i++)
    
      arr[i]=rand()%100;
    

    for(i=0;i<=n;i++)
    
      cout<<"\t"<<arr[i];
    

    quickSort(arr,n,i);

    for(i=1;i<n;i++)
    
      cout<<"\n"<<arr[i];
    

    getch();


int partition()

  // int i;
  // int sum=0;
  // int pivot;
  // stable_sort(arr,arr+3);
    for(i=0;i<5;i++)
    
       cout<<"\nsorted k elements\t"<<arr[i];
       // sum=sum+arr[i];
    
    // cout<<sum;
    //cout<<"median is "<<sum/3;
    pivot=arr[(i)/2];
    cout<<"pivotis value at position "<<pivot ;
    return pivot;


void quickSort(int arr[],int left,int right) 

      partition();
      right=n,left=0;
      int i = right, j =left;

      int tmp;
      int p=pivot;
      cout<<" m array of p"<<p;
      while (i <= j) 
        while (arr[i] < p)
          i++;
        while (arr[j] > p)
          j--;
        if (i <= j) 
          tmp = arr[i];
          arr[i] = arr[j];
          arr[j] = tmp;
          i++;
          j--;
        
    
    if (left < j)
    
       quickSort(arr, left, j);
    
    if (i < right)
    
       quickSort(arr, i, right);
    

【问题讨论】:

你怎么知道你有一个逻辑错误?你能提供一个小样本输入数据集的结果吗? 标题 'NO IDEA WATS THE PROBLEM' 对你没有帮助,所以我,错误 - 完善了它。你试过调试这个吗?找到错误了吗? 我没有在分区中声明 您已请求帮助查找“错误”。我看这段代码的次数越多,我就越确信错误是全部。不要尝试修复此代码。废弃它并使用您知道有效的代码重新开始。一旦您自己确认它有效,然后开始试验。进行更改,看看它是否仍然有效。如果没有,请撤消该更改并尝试其他方法。 【参考方案1】:

无论您当时碰巧对数组的哪个部分进行排序,您的枢轴值将始终是arr[(i)/2] 的值,即arr[2]。将leftright 的值传递给partition,以便它知道当前调用quickSort 时要考虑哪些值。

此外,您传递给quickSortinitial 调用的leftright 的值分别是20 和21,这肯定不是您想要的。您有一个长度为 100 的数组,并且您已经初始化了前 21 个元素,因此您可能希望为这些参数传递 0 和 21。

但是,如果您想使用 不同 枢轴策略测试快速排序,您可能应该做的第一件事是使用 典型的 first 使其工作 枢轴策略,就像你教科书中展示的那样。从一个工作实现开始,只有然后你才应该开始尝试变体。你应该能够在你的教科书或课堂笔记中找到一个可行的实现。

【讨论】:

谢谢。但是你能告诉我我是否在不同的函数之间正确传递了值(函数参数)。或者在调用这些函数时?? 您将值传递到任何东西的唯一地方是当您调用quickSort 时。我已经告诉过你,你在第一次调用时传递了错误的值。如果您正确计算ij,那么我认为递归调用可能没问题,但您不是。 (j 开始等于 left,然后你对它所做的就是递减它;当你确实期望它会更大然后left?)你不是将 any 值传递给 partition,这是此代码中的众多问题之一。【参考方案2】:

我没有找到您比较数组中的值的任何地方。

我想你应该检查一下这个地方:

    if (i <= j) 
      tmp = arr[i];
      arr[i] = arr[j];
      arr[j] = tmp;
      i++;
      j--;
    

应该是这样的:

    if (arr[i] < arr[j]) 
      tmp = arr[i];
      arr[i] = arr[j];
      arr[j] = tmp;
      i++;
      j--;
    

【讨论】:

以上是关于快速排序实现,找不到错误的主要内容,如果未能解决你的问题,请参考以下文章

快速排序实现错误

快速排序算法C#实现

快速排序 - 最坏情况

快速排序的分析与实现

快速排序的 C++ 实现中的运行时错误

使用JS实现快速排序