中位数 3 快速排序实现
Posted
技术标签:
【中文标题】中位数 3 快速排序实现【英文标题】:median 3 quick sort implementation 【发布时间】:2011-04-14 16:53:06 【问题描述】:我的中位数 3 实现在这里无法正常工作。我必须随机选择 3 个数字作为媒介,这是我的代码,请帮助我。
#include"stdafx.h"
#include <iostream>
#include<algorithm>
using namespace std;
#define size 10
int i;
void show(int* array, int n);
int partition(int* array, int pValue, int left, int right);
void QuickSort(int* array, int left, int right);
int main(void)
int array[size];
int i;
for( i = 0; i < size; i++)
array[i]=rand()%100;
cout<<endl<<"The random generated numbers are: "<<endl;
show(array, size);
QuickSort(array,0,size - 1);
cout<<endl<<"The sorted numbers are : "<<endl;
show(array, size);
system("pause");
return 0;
void show(int* array, int n)
int i;
for( i = 0; i < n; i++) cout<<array[i]<<'\t';
void QuickSort(int* array, int left, int right)
for(i=0;i<3;i++)
array[i]=array[rand()%100];
stable_sort(array,array+3);
int p=array[(i+1)/2];
//int p = array[left];
int split;
if(right > left)
split = partition(array, p, left, right);
array[split] = p;
QuickSort(array, left, split-1);
QuickSort(array, split+1, right);
int partition(int* array, int p, int left, int right)
int lb = left;
int rb = right;
while(lb < rb)
while( p < array[rb]&& rb > lb)
rb--;
swap(array[lb], array[rb]);
while( p >= array[lb]&& lb < rb)
lb++;
swap(array[rb], array[lb]);
return lb;
【问题讨论】:
告诉我们它为什么不起作用会帮助我们帮助您。它编译失败吗?它运行但显示错误?它会运行但产生错误的结果吗?它会永远持续下去吗? @ Martinho Fernandes 当我在最左边的元素中枢轴时,它工作正常,但是当我想通过将前 3 个元素的中值作为枢轴来更改枢轴的值时,它会产生一些垃圾值。跨度> 这是您第 5 次提出此问题,但您的代码仍然完全损坏。也许你应该把这个任务放在一边,从更简单的事情开始。 这显然不是 C 代码。 【参考方案1】:你的代码对于这个简单的算法来说太复杂了,检查下面的代码:
void QuickSortMedian(int a[],int start,int end)
int q;
count++;
if (end-start<2) return;
q=MedianOfThreePartition(a,start,end);
QuickSortMedian(a,start,q);
QuickSortMedian(a,q,end);
int MedianOfThreePartition(int a[],int p, int r)
int x=a[p],y=a[(r-p)/2+p],z=a[r-1],i=p-1,j=r;
if (y>x && y<z || y>z && y<x ) x=y;
else if (z>x && z<y || z>y && z<x ) x=z;
while (1)
do j--;count++; while (a[j] > x);
do i++;count++; while (a[i] < x);
if (i < j) swap(&a[i],&a[j]);
else return j+1;
void QuickSortRandomAndMedian(int a[],int start,int end)
int q;
count++;
if (end-start<2) return;
q=RandomAndMedianPartition(a,start,end);
QuickSortRandomAndMedian(a,start,q);
QuickSortRandomAndMedian(a,q,end);
int RandomAndMedianPartition(int a[],int p, int r)
int t,x=a[t=((rand()%(r-p))/2)+p+(r-p)/4],y=a[t+1],z=a[t-1],i=p-1,j=r;
if (y>x && y<z || y>z && y<x ) x=y;
else if (z>x && z<y || z>y && z<x ) x=z;
while (1)
do j--;count++; while (a[j] > x);
do i++;count++; while (a[i] < x);
if (i < j) swap(&a[i],&a[j]);
else return j+1;
第二种算法只是我为优化快速排序而编写的一个提升,例如,在 40000 个元素的数组上,常规快速排序执行了大约 800k 操作,中位数执行了 650k,随机中位数执行了大约 620k。这是迄今为止我得到的最好的。 :)
【讨论】:
【参考方案2】:也许问题就在这里:
array[i]=array[rand()%100];
首先,您正在更改数组的一些元素,而此时您应该将它们与其他元素交换。否则,您将破坏数据。
其次,您的数组大小为 10,但您要求在 0 到 99 之间的随机位置建立索引。显然,您不能这样做,这就是您得到垃圾的原因。
【讨论】:
非常感谢,但现在我没有得到垃圾值,但元素没有正确排序?? @james:你知道如何使用调试器吗?如果没有,请忘记其他一切,并将其作为您的直接目标。然后抓住一个并尝试单步调试代码,看看哪里出错了。 @james:每次调用QuickSort()
时,问问自己array
的前三个元素发生了什么变化。您的三中位数实现正在破坏数组中的数据。以上是关于中位数 3 快速排序实现的主要内容,如果未能解决你的问题,请参考以下文章