快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱乐在线官网:c语言算法分而治之算法选择排序



对付给定的n 个元素的数组a [ 0 : n - 1 ],要求从中找出第k小的元素。当a [ 0 : n - 1 ]被排序时,该元素便是a [ k - 1 ]。假设n = 8,每个元素有两个域k e y和I D,此中k e y是一个整数,I D是一个字符。假设这8个元素为[ ( 1 2 ,a),( 4 ,b),( 5 ,c),( 4 ,d),( 5 ,e),( 1 0 ,f),( 2 ,g),( 2 0 ,h)], 排序后获得数组[ ( 2 ,g),( 4 ,d),( 4 ,b),( 5 ,c),( 5 ,e),( 1 0 ,f),( 1 2 ,a),( 2 0 ,h) ]。假如k = 1,返回I D为g 的元素;假如k = 8,返回I D为h 的元素;假如k = 6,返回是I D为f 的元素;假如k = 2,返回I D为d 的元素。实际上,对着末一种环境,和记娱乐在线官网所获得的结果可能不独一,由于排序历程中既可能将I D为d 的元素排在a [ 1 ],也可能将I D为b 的元素排在a [ 1 ],缘故原由是它们具有相同大年夜小的k e y,因而两个元素中的任何一个都有可能被返回。然则无论若何,假如一个元素在k = 2时被返回,另一个就必须在k = 和记娱乐在线官网3时被返回。

选择问题的和记娱乐在线官网一个利用便是探求中值元素,此时k = [n / 2 ]。中值是一个很有用的统计量,例如中心人为,中心年岁,中心重量。其他k值也是有用的。例如,经由过程探求第n / 4 , n / 2和3 n / 4这三个元素,可将人口划分为4份。

选择问题可在O ( n l o g n )光阴内办理,措施是首先对这n个元素进行排序(如应用堆排序式或归并排序),然后掏出a [ k - 1 ]中的元素。若应用快速排序(如图1 4 - 11所示),可以和记娱乐在线官网得到更好的匀称机能,只管该算法有一个对照差的渐近繁杂性O( n2 )。

可以经由过程修写法度榜样1 4 - 6来办理选择问题。假如在履行两个w h i l e轮回后支点元素a [ l ]被互换到a [ j ] ,那么a [ l ]是a [ l : j ]中的第j - l + 1个元素。假如要探求的第k 个元素在a [ l : r ]中,并且j - l + 1即是k,则谜底便是a [ l ];假如j - l + 1 < k,那么探求的元素是r i g h t中的第k - j + l - 1个元素,否则要探求的元素是left 中的第k个元素。是以,只需进行0次或1次递归调用。新代码见法度榜样1 4 - 7。S e l e c t中的递归调用可用f o r或w h i l e轮回来替代(演习2 5)。

法度榜样14-7 探求第k 个元素

template

T Select(T a[], int n, int k)

{// 返回a [ 0 : n - 1 ]中第k小的元素

// 假定a[n] 是一个伪最大年夜元素

if (kn) throw OutOfBounds();

return select(a, 0, n-1, k);

}

template

T select(T a[], int l, int r, int k)

{// 在a [ l : r ]中选择第k小的元素

if (l >= r) return a[l];

int i = l, // 从左至右的游标

j = r + 1; // 从右到左的游标

T pivot = a[l];

// 把左侧>= pivot的元素与右侧= pivot 的元素

i = i + 1;

} while (a[i]

do {// 在右侧探求 pivot);

if (i >= j) break; // 未发明互换工具

Swap(a[i], a[j]);

}

if (j - l + 1 == k) return pivot;

// 设置p i v o t

a[l] = a[j];

a[j] = pivot;

// 对一个段进行递归调用

if (j - l + 1

法度榜样1 4 - 7在最坏环境下的繁杂性是( n2 ),此时left 老是为空,而且第k个元素老是位于r i g h t.

假如假定n 是2的幂,则可以取消公式(2 - 1 0)中的向下取整操作符。经由过程应用迭代措施,可以获得t (n) = (n)。若仔细地选择支点元素,则最坏环境下的光阴开销也可以变成(n)。一种选择支点元素的措施是应用“中心的中心( m e d i a n - o f - m e d i a n)”规则,该规则首先将数组a中的n 个元素分成n/r 组,r 为某一整常数,除了着末一组外,每组都有r 个元素。然后经由过程在每组中对r 个元素进行排序来探求每组中位于中心位置的元素。着末根据所获得的n/r 其中心元素,递归和记娱乐在线官网应用选择算法,求得所必要的支点元素。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: