求数组中第n大(小)的元素

本文介绍了一种基于快速排序原理的查找算法,通过每次partition操作确定一个元素的位置,并据此缩小查找范围,实现平均时间复杂度为O(n)的查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 算法原理

使用快速排序进行查找,类似于二分查找的意思,因为每次都会有一个元素找到适当位置,该位置就是这个元素在数组中的排列顺序。每次partition会返回一个数组下标,将该数组下标的元素和待查找的值进行比较,如果相等,直接返回,如果大于,取partition操作后的右一侧,反之,取左一侧。

2 时间复杂度

    利用快速排序进行查找,类似与二分查找思想,其操作数为
n+n/2+n/4+.....,由此可见,其时间复杂度为O(n)

3 实现

/**
 * 求数组中第k小的元素 
 * 快速排序 
 * 时间复杂度为O(n)
 * @author xld
 *
 */
public class Selection {

    public static int solve(int[] arr, int k) {
        return solve(arr, 0, arr.length - 1, k);
    }

    public static int solve(int[] arr, int l, int r, int k) {
        if (arr[l] == k)
            return arr[l];
        int p = partition(arr, l, r);
        if (arr[p] == k)
            return arr[p];
        else if (arr[p] > k)
            return solve(arr, l, p - 1, k);
        else
            return solve(arr, p + 1, r, k);
    }

    public static int partition(int[] arr, int l, int r) {
        int v = arr[l];
        int j = l;
        for (int i = l + 1; i <= r; i++) {
            if (arr[i] < v) {
                j++;
                swap(arr, i, j);
            }
        }
        swap(arr, l, j);
        return j;
    }

    private static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    // 测试InsertionSort
    public static void main(String[] args) {
        int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
        int ret = Selection.solve(arr, 3);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            System.out.print(' ');
        }
        System.out.println();
        System.out.println("第k小的元素为:"+ret);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值