快速排序实现,找不到错误
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]
。将left
和right
的值传递给partition
,以便它知道当前调用quickSort
时要考虑哪些值。
此外,您传递给quickSort
的initial 调用的left
和right
的值分别是20 和21,这肯定不是您想要的。您有一个长度为 100 的数组,并且您已经初始化了前 21 个元素,因此您可能希望为这些参数传递 0 和 21。
但是,如果您想使用 不同 枢轴策略测试快速排序,您可能应该做的第一件事是使用 典型的 first 使其工作 枢轴策略,就像你教科书中展示的那样。从一个工作实现开始,只有然后你才应该开始尝试变体。你应该能够在你的教科书或课堂笔记中找到一个可行的实现。
【讨论】:
谢谢。但是你能告诉我我是否在不同的函数之间正确传递了值(函数参数)。或者在调用这些函数时?? 您将值传递到任何东西的唯一地方是当您调用quickSort
时。我已经告诉过你,你在第一次调用时传递了错误的值。如果您正确计算i
和j
,那么我认为递归调用可能没问题,但您不是。 (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--;
【讨论】:
以上是关于快速排序实现,找不到错误的主要内容,如果未能解决你的问题,请参考以下文章