微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决快速排序实现,找不到错误

| 我想用一些不同的数据透视策略来实现这种快速排序算法,但是其中存在一些逻辑错误。你能帮我找到吗?
#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,j);
    }
    if (i < right)
    {
       quickSort(arr,right);
    }
}
    

解决方法

无论您当时恰好要对数组的哪一部分进行排序,您的枢轴值始终为be1ѭ的值,即
arr[2]
。将
left
right
的值传递给
partition
,以便知道当前对
quickSort
的调用要考虑的值。 另外,您初次调用
quickSort
时传递的
left
right
的值分别为20和21,这肯定不是您想要的。您有一个长度为100的数组,并且已经初始化了前21个元素,因此您可能希望为这些参数传递0和21。 但是,如果要使用不同的数据透视策略测试quicksort,可能应该做的第一件事就是使它首先使用典型的数据透视策略(如教科书中演示的方法)工作。从一个可行的实现开始,然后才应该开始尝试各种变体。您应该能够在教科书或课堂笔记中找到有效的实现方式。     ,我没有找到任何地方可以比较数组中的值。 我想你应该检查一下这个地方:
    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--;
    }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。