您的位置:首页 > 其它

快速排序的枢轴(pivot)和边界

2013-02-28 20:16 148 查看
最近在看算法导论中的快速排序的算法,

算法的基本思想是选择数组中的一个元素x作为枢轴,然后与数组中的其它元素进行比较,

通过一趟排序使枢轴左边比x小,枢轴右边比x大,然后再递归的进行下去。

lz想,既然随便选一个元素当枢轴,就抱着试验的心理将枢轴从a[r]改为a[p]。但是结果不对。

再回头仔细看一下算法,发现当用不同的元素作为枢轴的时候,相应的边界条件要做出改变。

下面分别给出以 a[p]和a[r]作为枢轴时的代码,做个对照。下一步实现随机快速排序,请高手指教

以a[p]为枢轴时:

#include<iostream>
using namespace std;

int partition(int a[],int p,int r)
{
int x = a[p];
int i =r+1,j=0;
int tmp = 0;
for(j= r; j >=p+1;j--)
{
if(a[j] >= x)
{
i--;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[p];
a[p] = a[i-1];
a[i-1] = tmp;
return i-1;
}
void quickSort(int a[],int p,int r)
{
if(p < r)
{
int q = partition(a,p,r);
quickSort(a,p,q-1);
quickSort(a,q+1,r);
}
}
int main()
{
int a[10]={20,-2,1,9,5,21,46,30,96,17};
quickSort(a,0,9);
for(int i = 0;i <10;++i)
cout<<a[i]<<endl;
return 0;
}


以a[r]作为枢轴时:

#include<iostream>
using namespace std;

int partition(int a[],int p,int r)
{
int x = a[r];
int i =p-1,j=0;
int tmp = 0;
for(j= p; j <=r-1;j++)
{
if(a[j] <= x)
{
i++;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[r];
a[r] = a[i+1];
a[i+1] = tmp;
return i+1;
}
void quickSort(int a[],int p,int r)
{
if(p < r)
{
int q = partition(a,p,r);
quickSort(a,p,q-1);
quickSort(a,q+1,r);
}
}
int main()
{
int a[10]={20,-2,1,9,5,21,46,30,96,17};
quickSort(a,0,9);
for(int i = 0;i <10;++i)
cout<<a[i]<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: