gpt4 book ai didi

c - 如何修改此快速排序算法的主元选择?

转载 作者:行者123 更新时间:2023-11-30 19:11:28 24 4
gpt4 key购买 nike

我想修改列出的快速排序算法,以将主元选项选择为 1) 数组中的随机元素。 2) 数组中第一个中间元素和最后一个元素的中位数。====更新====另外,如何实现计时机制来对每个算法的运行时间进行计时?

void QuickSort1(long *L, int first, int last)
{
int SplitPoint; /* Value to Split list around */

if( first < last )
{
/* Use first element as pivot (for splitting) */
SplitPoint = first; /* assign SplitPoint to 1st index */
Split(L, first, last, &SplitPoint); /* Split List around SplitPoint */
QuickSort1(L, first, SplitPoint-1); /* Sort 1st section of list */
QuickSort1(L, SplitPoint+1, last); /* Sort 2nd section of list */
}
}

void Split(long *L, int first, int last, int *SplitPoint)
/* Splits a list around SplitPoint such that all values to the left of
SplitPoint are < than SplitPoint and all values to the right of
SplitPoint are >= SplitPoint */
{
int x; /* Key */
int unknown; /* index of unknown value */

x = L[*SplitPoint]; /* assign x to value at SplitPoint */
Swap( &L[*SplitPoint], &L[first] );
*SplitPoint = first;

/* Loop walks through unknown portion of list */
for ( unknown = first+1; unknown <= last; ++unknown)
{
/* If unknown value is < SplitPoint Value, then: */
#ifdef TAKE_COUNT
comparison_count++;
#endif
if( L[unknown] < x ) {
++ (*SplitPoint); /* SplitPoint is incremented */
Swap( &L[*SplitPoint], &L[unknown] ); /* values are swapped*/
}
}
/* Original value which was being split upon is swapped with the current
SplitPoint to put it in correct position */
Swap( &L[first], &L[*SplitPoint] );
}

int FindMedian(long *L, int A, int B, int C)
/* Receives array and three respective indices in the array. */
/* Returns the index of the median. */
{
if (L[A] < L[B])
if (L[B] < L[C]) /* A < B < C */
return (B);
else
if (L[A] < L[C]) /* A < C < B */
return (C);
else
return (A); /* C < A < B */
else
if (L[A] < L[C]) /* B < A < C */
return (A);
else
if (L[B] < L[C]) /* B < C < A */
return (C);
else
return (B); /* C < B < A */
}

void Swap(long *a, long *b)
/* This function uses call by reference to switch two elements.*/
{
long temp; /* temporary variable used to switch. */

temp = *a; /* temp = 1st # */
*a = *b; /* 1st # = 2nd # */
*b = temp; /* 2nd # = temp */
}

我如何才能针对列出的枢轴选项修改此设置。它们还必须添加为程序的附加菜单选项。

最佳答案

secret 在于您始终选择数组中的第一个元素作为枢轴点。如果您希望使用另一个元素(如果输入已经排序或(常见情况)大部分排序并附加了一些新元素,这是一个非常好的主意),请将其与第一个元素交换。现在枢轴是第一个元素。

有了这种洞察力,任务应该变得非常简单。要选择随机主元,请生成 ) 到 N-1 的随机数,并与第一个元素交换。要取中位数为 3,请编写一组看似困惑但简单明了的 if ... else 语句。

关于c - 如何修改此快速排序算法的主元选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074522/

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