中位数之第K小的线性选择算法(续)

本文介绍了线性选择算法的实现细节,并提供了一段用于找出数组中第K小元素的C语言代码示例。通过递归地对数组进行划分,算法能够高效地找到目标元素。

       前一段时间翻译了中位数之第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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值