【问题标题】:Determine the Top 10 biggest numbers确定前 10 个最大的数字
【发布时间】:2016-10-16 10:33:11
【问题描述】:

我有 4 个数据库。所有包含相同的成员,其得分来自不同的目标射击比赛。我想确定总体前 10 名的最高分数。然后我将第一个 DB 中的分数添加到数组中,然后将第二个 DB 中成员的分数添加到数组中(添加分数)。以此类推,直到最后。那么我如何获得 10 个最大的分数?我看过排序数组。我认为我的解决方案就在那里。

【问题讨论】:

  • 我很少在 SO 上问这个问题,但是您尝试过什么? -1
  • 使用for 循环搜索您的数组以获得最大分数。循环内部:if arr[I] > s1 then begin s1 := arr[I]; s1Index := I; end; 所以在循环结束时s1 将是最大分数,s1Index 是该分数的位置。现在,当您想要第二大的分数时,您必须首先删除最大的(因为您不想再次找到它)。然后重复上面的搜索最大的。不断重复s3, s4,... 等。当您的创造性和快速解决方案获得适当标记时,您将了解在提出 SO 之前进行零研究的好处。
  • 是的,我试过了。
  • @Stefan 他没有问你是否尝试过。他问你尝试了什么。所以edit 你的问题并解释你尝试过的什么。没有冒犯,但是当您声称“您已经尝试过”时,我没有理由相信您。我的祖母总是教我:永远不要相信互联网上的陌生人。

标签: delphi


【解决方案1】:

您的数据库引擎可以以最好的方式完成这项工作 - 只需执行如下查询:

 SELECT name, score FROM membertable ORDER BY score DESC LIMIT 10

如果您已经获得了数组中的所有数据,请应用Quickselect 算法来获得 10 个最佳值(无需完全排序)

【讨论】:

  • 答案的查询部分质量非常低,因为 (a) 忽略 Q 的数组部分 (b) 假设 SQL 数据库 (c) 使用古怪的专有语法。我不明白为什么这么多票...
  • @Free Consulting a)我认为数组的最佳解决方案之一(来自algor.POV)b)作者没有描述数据库细节,但他必须知道DB的蛮力使用是错误的方式。
【解决方案2】:

好的,这是我使用的代码:

For I := 0 to iCount -2 do               //iCount is length of DB   
       for J := I+1 to iCount -1 do 
        if arrScore[I] < arrScore[J] then
       begin
         T := arrScore[I];
         K := arrMember[I];
         arrScore[I] := arrScore[J];// arrScore holds member's score
         arrMember[I] := arrMember[J];// arrMember holds member's name
         arrScore[J] := T;
         arrMember[J] := K;
       end;

感谢您的所有回答,它确实有效。

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 2018-05-04
    • 2020-08-14
    • 2021-04-23
    • 2021-09-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多