[关闭]
@quinn 2015-03-18T10:23:13.000000Z 字数 686 阅读 2053

快速排序(3)的应用:选择--用于选出第K小的元素

排序算法


本文描述了一个快速排序的应用,用快速排序快速的选出数据中第k小的文件(元素)。

一个与排序有关但又不需要完全排序的应用是找出一组数的中间数的操作。寻找中间元素时选择操作的一个特例,即选择一组数中的第k个最小元素。一种方法是对数据进行排序,但我们可以使用快速排序的划分过程做的更好。

算法过程(寻找第k小的元素)

程序实现

递归实现选择算法

  1. /*=============选择函数--选出第k小的元素=============*/
  2. void select(Item a[], int l, int r, int k) //递归实现
  3. {
  4. if(r <= l)
  5. return;
  6. int i = partation(a, l, r);
  7. if(k < i)
  8. select(a, l, i-1, k);
  9. else if(k > i)
  10. select(a, i+1, r, k);
  11. }

非递归实现

  1. void select_2(Item a[], int l, int r, int k) // 非递归实现
  2. {
  3. while(r > l)
  4. {
  5. int i = partation(a, l, r);
  6. if(k < i)
  7. r = i-1;
  8. if(k > i)
  9. l = i+1;
  10. }
  11. }

由于上述划分过程是将原数组中的数据进行交换,因此用上述选择算法操作数组后,a[k]中的元素就是第k小的元素。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注