前一段时间翻译了中位数之第K小的线性选择算法,由于翻译水平有限,感觉对上文不是很满意。不过中位数算法的大致意思我想已经在上文中说的比较清楚了,在这我就不多说了。本文的主要目的是对于算法的实现。
最近抽了些时间把该算法做了,基本是按照上文的思路走的。突然心情激动了一下,就想把代码贴上来,主要目的还是想和大家交流。毕竟靠一个人的力量想学好算法那还真是有些难度的。
不浪费时间了,直接看代码吧!
/*** 从array[left, right] 中找出第 k 小的数 ***/
int selection(int array[], int left, int right, int k) {
if (left > right || (k - 1) > right - left) {
return -1;
}
if (left == right) {
return array[left];
}
int mid = partition(array, left, right);
int len = mid - left;
if ((k - 1) == len) {
return array[mid];
} else if ((k - 1) < len) { /*** 要找的数在左集合中 ***/
return selection(array, left, mid - 1, k);
} else { /*** 要找的数在右集合中 ***/
return selection(array, mid + 1, right, k - len - 1);
}
}
/** 对数组进行一次划分,[left, mid - 1] [mid] [mid + 1, right] ***/
int partition(int array[], int low, int high) {
int x = array[low];
int m = low;
int i;
for (i = low + 1; i <= high; i++) {
if (array[i] < x) {
swap(array, ++m, i);
}
}
swap(array, low, m);
return m;
}
int swap(int a[], int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
return 0;
}
测试:找出数组中第K小元素
int main()
{
int array[] = {3,7,9,4,2,8};
int k;
printf("Please input k: ");
scanf("%d",&k);
printf("%d",selection(array, 0, 6, k));
return 0;
}
测试截图:编译环境为codeblocks