Selection Problem

Table of Contents

k-th Smallest Element in the Union of Two Sorted Arrays

Median of two sorted arrays

Median of two sorted arrays of different sizes

Random Selection

算法平均时间复杂度: O(n) 。

unsigned int seed = time(NULL);
int randint(int m, int n) {
  return m + rand_r(&seed) / (RAND_MAX / (n + 1 - m) + 1);
}

void RandomSelectionK(int *array, int l, int u, int k) {
  if (l >= u) {
    return;
  }
  swap(array[l], array[randint(l, u)]);
  int pivot = array[l];
  int i = l;
  int j = u + 1;
  while (true) {
    do {
      ++i;
    } while (i <= u && array[i] < pivot);
    do {
      --j;
    } while (array[j] > pivot);
    if (i > j) {
      break;
    }
    swap(array[i], array[j]);
  }
  swap(array[l], array[j]);
  if (j < k) {
    RandomSelectionK(array, j + 1, u, k);
  } else if (j > k) {
    RandomSelectionK(array, l, j - 1, k);
  }
}

BFPRT1

在乱序数组中找寻中间元素,算法复杂度O(n).

算法刊登在Blum et al. (Tarjan)。经常称为BFPRT,以论文作者最后名字这和组合而来。

#include <algorithm>
using std::swap;

void BubbleSort(int *array, int left, int right) {
  int bound = right;
  while (1) {
    int tmp = 0;
    for (int i = left; i <= right; ++i) {
      if (array[i] > array[i + 1]) {
        swap(array[i], array[i + 1]);
        tmp = i;
      }
    }
    if (tmp == 0) {
      break;
    }
    bound = tmp;
  }
}

int FindMedian(int *array, int left, int right) {
  const int kGroupSize = 5;
  int size = right - left + 1;
  if (size <= kGroupSize) {
    BubbleSort(array, left, right);
    return array[(size - 1) / 2 + 1];
  }
  int num_group = (size - kGroupSize + 1) / kGroupSize;
  for (int i = 0; i < num_group; ++i) {
    int sub_left = left + kGroupSize * i;
    int sub_right = sub_left + kGroupSize - 1;
    if (sub_right > right) {
      sub_right = right;
    }
    BubbleSort(array, sub_left, sub_right);
    swap(array[left + i], array[(right + left - 1) / 2 + 1]);
  }
  return FindMedian(array, left, left + num_group - 1);
}

Tournament Algorithm

Find the second-largest element

算法复杂度O(n+logn);

Find the k-largest element

算法复杂度O(n+klogn);

Footnotes:

Author: Shi Shougang

Created: 2015-03-05 Thu 23:21

Emacs 24.3.1 (Org mode 8.2.10)

Validate