线性时间内寻找第k小的数

当前编程题:线性时间内寻找元素—线性时间内寻找元素(递归与分治)

【问题描述】每次都是优化选出一个元素为划分基准,在线性时间内寻找第i小元素。

【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。再输入要寻找的元素是数组从小到大顺序中第几个位置。

【输出形式】数组从小到大顺序中要寻找的那个位置的元素。

【样例输入】

2 9 8 0 7 10 1 12 3 14 5 13 6 11 4

3

【样例输出】

2

【样例说明】

输入:15个整数,以空格分隔。要寻找第3小元素。

扫描二维码关注公众号,回复: 10515829 查看本文章

输出:2,表示第3小元素为2。

【评分标准】根据输入得到准确的输出。

思想:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法导论上的伪代码:
在这里插入图片描述
在这里插入图片描述
代码:

import numpy as np


def Partition(L, p, r):  # 划分数组,返回基准元素下标
    x = L[r]
    i = p-1
    for j in range(p,r):
        if L[j] <= x:
            i = i+1
            L[i], L[j] = L[j], L[i]
    L[i+1], L[r] = L[r], L[i+1]
    return i+1 


def Select(L, p, r, i):  # 在L[p]到L[r]中找第i小的数
    cur = Partition(L, p, r)
    k = cur-p+1
    if i == k:
        return L[cur]
    elif i < k:
        return Select(L, p, cur-1, i)
    else:
        return Select(L, cur+1, r, i-k)


def main():
    L = np.array(list(map(int, input().split())))
    n = len(L)-1
    j = input()
    j = int(j)
    c = Select(L, 0, n, j)  # 报错
    print(c)


if __name__ == '__main__':
    main()
    

发布了110 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40486952/article/details/88649466