前一段時間翻譯了中位數之第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