使用三元素划分实现快速排序算法

3

如何将这个快速排序算法转换为3、5、7、9和11个元素的分区?

#include"stdafx.h"
#include<iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#define size 50
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}

int partition(int i,int j )
{
return((i+j) /2);
}

void quicksort(int list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = partition(m,n);
swap(&list[m],&list[k]);
key = list[m];
i = m+1;
j = n;
while(i <= j)
{
while((i <= n) && (list[i] <= key))
i++;
while((j >= m) && (list[j] > key))
j--;
if( i < j)
swap(&list[i],&list[j]);
}

swap(&list[m],&list[j]);
quicksort(list,m,j-1);
quicksort(list,j+1,n);
}
}
void printlist(int list[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\t",list[i]);
}

void main()
{
int n,i;
int list[size];


printf("How many numbers do you want to enter");
scanf("%d",&n);
printf("Enter the numbers you want to sort");
for(i=0;i<n;i++)
{
scanf("%d",&list[i]);
}


printf("The list before sorting is:\n");
printlist(list,n);
quicksort(list,0,n-1);
printf("The list after sorting using quicksort algorithm:\n");
printlist(list,n);
system("pause");
}

快速排序中的分区阶段包括将要排序的序列元素重新排列到所选枢轴的左侧或右侧,具体取决于它们相对于枢轴是较小还是较大。不确定“_x_的分区”是什么意思。 - abeln
如果你在阅读了格雷格的回答之后仍然有问题,可以将它们添加到这个问题中(如果它们相关),或者创建一个新的问题。 - Paŭlo Ebermann
2个回答

5
我认为你的C++老师用词不当。“3个元素的分区”几乎肯定是指:通过选择第一个、中间和最后一个元素的中位数来选择枢轴元素——这是最常见的编码技术,当数组已经排序时具有良好的性能特性。
将该定义推广到5、7、9、11个元素。

1
我认为这不是措辞不当,而是某种非常棘手的问题。 - Mushahid Hussain
啊,我原以为的想法是将其分成4/6/8个部分,而不仅仅是两个。 - Paŭlo Ebermann

0

划分是快速排序算法的重要部分。请查看该算法以了解划分是什么。祝你好运。


没问题,但是您能详细解释一下“_x_个元素的分区”是什么吗? - abeln
是的,我知道当枢轴找到正确的位置时,分区会发生。但是我不知道x个元素的分区的意义。 - Mushahid Hussain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接