Quicksort实现,找不到错误

时间:2011-04-13 13:55:44

标签: c++ c algorithm sorting quicksort

我想用一些不同的数据透视策略实现这个快速排序算法,但是它有一些逻辑错误。能帮我找到吗?

#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);
    }
}

2 个答案:

答案 0 :(得分:3)

您的数据透视值始终为arr[(i)/2]的值,即arr[2],无论您当时正在排序的数组部分是什么。将leftright的值传递给partition,以便知道当前对quickSort的调用应考虑哪些值。

此外,您为初始调用left而传递的rightquickSort的值分别为20和21,肯定不是'你的意图。你有一个长度为100的数组,并且你已经初始化了前21个元素,所以你可能希望为这些参数传递0和21。

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

答案 1 :(得分: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--;
    }