对1000000个数进行排序找出10个最大的数---后记1

本文介绍了一种使用选择排序算法来从大量数据中找出十个最大数值的方法。通过不断选择未排序部分的最大值并与已排序部分的起始位置进行交换,最终得到所需的最大数值集合。

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

前几天的那个问题本问题“对1000000个数进行排序找出10个最大的数”也可以用插入排序或选择排序,对于选择排序在目标数中每次选择最大的数,与前面的10个数进行交换,大约需O(10*n)的时间消耗。如下算法:
void InsertSort(long data[], long count)
{
    /*
    *    在count个数中找到最大的数,与第0个进行交换,然后再在后count-1中找到最大的,与
    *    第1个进行交换,依此类推,直到前10个数都与相应的数交换完毕,输出前10个数就行了,
    *    这就是选择排序的一部分,不过同快速排序和堆排序一样却破坏了原来的data[]。
    */
    long temp, num = 0;    // num统计运行的次数
    long i = 0, j = 0, k = 0;    // 用k纪录data的前10位数
    for (i = 0; i < 10; i++)
    {
        ++num;
        temp = data[k];    // data[k]作为监视哨
        for (j = i; j < count; j++ )
        {
            ++num;
            if (data[k] < data[j])
            {
                data[k] = data[j];
            }
        }
        data[j] = temp;    // 交换到位
        k++;    // 下一个
    }
}
先吃饭吧(tasty) 【题目描述】 有一张 n 个点 m 条边的无向图,每条边上有一个小于 k 的权值 w。 在接下来的 r 天中,麻油每天都会从 1 号节点沿图中的边一直走,直到走到 n 号节 点结束。将第 i 天行走过程中经过的边依次连成一个 k 进制(最先经过的在最高位), 并忽略前导零后记为 bi。 再将 b1, b2, . . . , br 依次拼为一个数(b1 在最高位),得到 x。 定义 f(x) 表示 [1..x] 中有多少个数 v 满足 k 进制中不存在相邻的两位 vi−1, vi 满足 k vi+1 = k vi−1+1 或 √ vi + 1 = √ vi−1 + 1。其中 vi 表示 v 在 k 进制下的第 i 位。 现在麻油想问你,在所有可能的情况中 f(x) 可能取到的最小值。 【输入格式】 从文件 tasty.in 中读入据。 第一行包含两个正整 n, m, k, r,表示题目描述中的 n, m, k, r。 接下来 m 行,每行输入三个数 ui , vi , wi 表示一条连接 ui , vi 边权为 wi 的无向边, 保证 1 ≤ ui , vi ≤ n, 0 ≤ wi < k。保证当 1 ∈ {ui , vi} 时,wi > 0。 【输出格式】 输出到文件 tasty.out 中。 输出共一行,表示在所有可能的情况中 f(x) 可能取到的最小值 mod (109 + 7) 是 多少。 【样例 1 输入】 1 3 4 3 1 2 2 1 1 3 3 2 1 4 1 2 2 5 2 3 0 【样例 1 输出】 1 3 该样例满足 1 的要求 【样例 2】 见选手目录下的 tasty/tasty2.in 与 tasty/tasty2.ans。 该样例满足 1 的要求 【样例 3】 见选手目录下的 tasty/tasty3.in 与 tasty/tasty3.ans。 该样例满足 2 的要求 【样例 4】 见选手目录下的 tasty/tasty4.in 与 tasty/tasty4.ans。 该样例满足 3 的要求 【样例 5】 见选手目录下的 tasty/tasty5.in 与 tasty/tasty5.ans。 该样例满足 4~6 的要求 【样例 6】 见选手目录下的 tasty/tasty6.in 与 tasty/tasty6.ans。 该样例满足 7~10 的要求 【样例 7】 见选手目录下的 tasty/tasty7.in 与 tasty/tasty7.ans。 该样例满足 13~15 的要求 【样例 8】 见选手目录下的 tasty/tasty8.in 与 tasty/tasty8.ans。 该样例满足 16~20 的要求 【子任务】 据点 n k r 性质 A 1 ≤ 5 ≤ 3 ≤ 3 否 2 ≤ 2 × 104 ≤ 2 ≤ 109 3 ≤ 103 ≤ 3 4 ∼ 6 ≤ 30 是 7 ∼ 10109 11, 12 ≤ 3 13 ∼ 15 ≤ 30 否 16 ∼ 20 ≤ 109 性质 A: 满足 m = n − 1, ∀1 ≤ i ≤ m, ui = i, vi = i + 1 对于所有据,满足 m ≤ 2 × 105,保证图联通,但不保证无自环且无重边。
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值