中位數之第K小的線性選擇算法(續)

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


發佈了23 篇原創文章 · 獲贊 11 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章