我想用一些不同的数据透视策略实现这个快速排序算法,但是它有一些逻辑错误。能帮我找到吗?
#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);
}
}
答案 0 :(得分:3)
您的数据透视值始终为arr[(i)/2]
的值,即arr[2]
,无论您当时正在排序的数组部分是什么。将left
和right
的值传递给partition
,以便知道当前对quickSort
的调用应考虑哪些值。
此外,您为初始调用left
而传递的right
和quickSort
的值分别为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--;
}