- 论坛徽章:
- 0
|
本帖最后由 千年沉寂 于 2010-03-26 09:38 编辑
能讲详细点嘛,说实话,没太看明白。快速排序和折半排序都我都明白,但你这个真没看明白,希望能展开详 ...
dozec 发表于 2010-03-25 23:43 ![]()
实际上是模仿快速排序算法设计的,其基本思想也是对输入数组进行划分。不同的是,它只对划分出的子数组之一进行处理。
过程大致如下:- int RandomSelect(int a[], int left, int right, int k)
- {
- int i,j,p;
- if (right <= 1) return a[right];
- i = RandomPartition(a[], left, right);
- /************************************************
- * RandomPartition,把a[left:right]随机划分为:
- * a[left : i-1] <= a[i] <= a[i+1 : right].
- *************************************************/
- j = right - i + 1;
- /* j 为 a[i : right] 的元素个数*/
- if (j == k) return a[i];
- if (j > k)
- /* 第k大的数在右子数组 */
- return RandomSelect(a, i+1, right, k);
- else
- /* 第k大的数在左子数组 */
- return RandomSelect(a, left, i-1 , k-j);
- }
复制代码 |
|