gpt4 book ai didi

c++ - 中位数 3 快速排序实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:04 31 4
gpt4 key购买 nike

我的中位数 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;


}

最佳答案

你的代码对于这个简单的算法来说太复杂了,检查下面的代码:

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。这是迄今为止我得到的最好的。 :)

关于c++ - 中位数 3 快速排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666717/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com