zoukankan      html  css  js  c++  java
  • Java多字段排序之冒泡

    场景:
    奥运会时期,每场赛事后,对国家的金、银、铜牌进行排序,排序规则如下:
    先以金牌排序,金牌数越多,排得越前,如果金牌数相同,则比银牌数,如果银牌数一样多,则比铜牌数,如果铜牌数还一样多,则按国家英文字母顺序升序排序。
    例如:
    China 51 20 21
    American 50 1 1
    Japan 0 0 0
    上面是三个国家的奖牌数,每一行依次是国家名、金牌数、银牌数、铜牌数。

    需求:
    请将奖牌按上面规则进行排序。

    Java的实现一:暴力排序,即进行四次冒泡排序。

    代码:

        public static String[] rankByBubble(String[] paramArray) {
            String[][] scores = new String[paramArray.length][4]; // 存储每个国家的金、银、铜的分数
            for (int i = 0; i < paramArray.length; i++) {
                String[] innerArray = paramArray[i].split(" ");
                scores[i] = innerArray;
            }
            //String[] temp = new String[4];
            for (int i = 0; i < scores.length - 1; i++) {
                for (int j = 0; j < scores.length - 1 - i; j++) {
                    if (Integer.valueOf(scores[j + 1][1]) > Integer.valueOf(scores[j][1])) {
                        String[] temp = scores[j];
                        scores[j] = scores[j + 1];
                        scores[j + 1] = temp;
                    }
                }
            }
            // 金牌一样时,比银牌
            for (int i = 0; i < scores.length - 1; i++) {
                for (int j = 0; j < scores.length - 1 - i; j++) {
                    if (Integer.valueOf(scores[j + 1][1]) == Integer.valueOf(scores[j][1])
                            && Integer.valueOf(scores[j + 1][2]) > Integer.valueOf(scores[j][2])) {
                        String[] temp = scores[j];
                        scores[j] = scores[j + 1];
                        scores[j + 1] = temp;
                    }
                }
            }
            // 金牌、银牌一样时,比铜牌
            for (int i = 0; i < scores.length - 1; i++) {
                for (int j = 0; j < scores.length - 1 - i; j++) {
                    if (Integer.valueOf(scores[j + 1][1]) == Integer.valueOf(scores[j][1])
                            && Integer.valueOf(scores[j + 1][2]) == Integer.valueOf(scores[j][2])
                            && Integer.valueOf(scores[j + 1][3]) > Integer.valueOf(scores[j][3])) {
                        String[] temp = scores[j];
                        scores[j] = scores[j + 1];
                        scores[j + 1] = temp;
                    }
                }
            }
            // 金牌、银牌、铜牌一样多时,按国家字母升序排
            for (int i = 0; i < scores.length - 1; i++) {
                for (int j = 0; j < scores.length - 1 - i; j++) {
                    if (Integer.valueOf(scores[j + 1][1]) == Integer.valueOf(scores[j][1])
                            && Integer.valueOf(scores[j + 1][2]) == Integer.valueOf(scores[j][2])
                            && Integer.valueOf(scores[j + 1][3]) == Integer.valueOf(scores[j][3])
                            && scores[j + 1][0].compareTo(scores[j][0]) < 0) {
                        String[] temp = scores[j];
                        scores[j] = scores[j + 1];
                        scores[j + 1] = temp;
                    }
                }
            }
    
            String[] rank = new String[paramArray.length];
            for (int i = 0; i < scores.length; i++) {
                rank[i] = scores[i][0];
            }
            return rank;
        }
    

    验证:

        @Benchmark
        @Test
        public void rankByBubble() {
    		String[] countries = {"Afghanistan 55 23 31", "Albania 68 3 79", "Algeria 66 39 62", "Andorra 15 88 70", "Angola 0 65 55", "Anguilla 44 46 47", "Antigua_and_Barbuda 12 10 119", "Argentina 26 52 10", "Armenia 18 0 45", "Ascension 69 6 17", "Australia 74 90 21", "Austria 12 9 58", "Azerbaijan 14 11 4", "Bahamas 32 31 29", "Bahrain 45 32 115", "Bangladesh 49 70 90", "Barbados 37 26 24", "Belarus 47 89 107", "Belgium 78 72 51", "Belize 58 18 98", "Benin 60 43 37", "Bermuda_Is. 26 53 69", "Bolivia 65 29 56", "Botswana 0 49 29", "Brazil 67 78 51", "Brunei 26 57 119", "Bulgaria 51 99 112", "Burkina-faso 57 33 78", "Burma 79 34 52", "Burundi 76 51 12", "Cameroon 66 15 57", "Canada 52 77 88", "Cayman_Is. 21 68 28", "Central_African_Republic 28 46 85", "Chad 65 45 81", "Chile 18 59 84", "China 28 24 39", "Colombia 57 84 38", "Congo 24 11 88", "Cook_Is. 31 24 65", "Costa_Rica 61 48 70", "Croatia 70 35 28", "Cuba 17 23 36", "Cyprus 60 12 51", "Czech_Republic 44 44 90", "Denmark 9 13 22", "Djibouti 40 92 97", "Dominica_Rep. 35 20 96", "Ecuador 10 68 94", "Egypt 2 47 12", "EI_Salvador 41 79 62", "Estonia 1 59 51", "Ethiopia 73 60 22", "Fiji 46 69 92", "Finland 60 99 84", "France 69 43 85", "French_Guiana 46 92 47", "French_Polynesia 11 42 94", "Gabon 13 14 31", "Gambia 19 63 83", "Georgia 14 6 81", "Germany 65 89 116", "Ghana 59 20 50", "Gibraltar 26 90 30", "Greece 63 47 112", "Grenada 39 36 6", "Guam 4 1 0", "Guatemala 46 24 7", "Guinea 20 55 69", "Guyana 35 19 69", "Haiti 16 95 75", "Honduras 38 9 27", "Hongkong 28 15 0", "Hungary 21 53 2", "Iceland 46 41 89", "India 13 9 34", "Indonesia 22 9 60", "Iran 9 28 32", "Iraq 72 82 83", "Ireland 16 97 23", "Israel 1 21 41", "Italy 69 38 63", "Ivory_Coast 25 61 21", "Jamaica 68 70 100", "Japan 30 57 36", "Jordan 2 49 7", "Kampuchea_(Cambodia) 15 38 87", "Kazakstan 12 27 116", "Kenya 76 51 76", "Korea 6 74 101", "Kuwait 53 25 4", "Kyrgyzstan 59 74 71", "Laos 44 11 98", "Latvia 20 12 47", "Lebanon 23 34 74", "Lesotho 46 52 36", "Liberia 52 49 89", "Libya 46 81 59", "Liechtenstein 62 66 26", "Lithuania 4 42 45", "Luxembourg 9 21 75", "Macao 31 8 48", "Madagascar 38 39 2", "Malawi 69 42 56", "Malaysia 10 97 63", "Maldives 8 34 72", "Mali 68 1 23", "Malta 28 66 119", "Mariana_Is 58 86 79", "Martinique 18 6 108", "Mauritius 38 3 92", "Mexico 36 32 11", "Moldova,_Republic_of 46 37 43", "Monaco 17 75 109", "Mongolia 79 67 4", "Montserrat_Is 12 57 32", "Morocco 59 16 94", "Mozambique 68 60 67", "Namibia 61 18 96", "Nauru 16 41 25", "Nepal 47 57 10", "Netheriands_Antilles 62 2 73", "Netherlands 58 14 54", "New_Zealand 35 76 40", "Nicaragua 26 26 62", "Niger 30 95 113", "Nigeria 0 30 43", "North_Korea 38 42 106", "Norway 15 75 16", "Oman 0 15 107", "Pakistan 47 0 117", "Panama 64 30 115", "Papua_New_Cuinea 64 79 93", "Paraguay 23 56 42", "Peru 31 90 14", "Philippines 10 1 74", "Poland 57 80 92", "Portugal 1 24 87", "Puerto_Rico 19 28 97", "Qatar 8 85 25", "Reunion 68 72 66", "Romania 26 1 40", "Russia 64 74 21", "Saint_Kitts_and_Nevis 37 37 30", "Saint_Lueia 51 31 34", "Saint_Vincent 79 19 78", "Samoa_Eastern 20 22 2", "Samoa_Western 51 3 48", "San_Marino 29 40 116", "Sao_Tome_and_Principe 41 53 102", "Saudi_Arabia 7 33 85", "Senegal 34 5 118", "Seychelles 77 10 37", "Sierra_Leone 48 80 68", "Singapore 27 86 57", "Slovakia 73 35 44", "Slovenia 42 56 78", "Solomon_Is 45 38 53", "Somali 26 29 24", "South_Africa 58 83 61", "Spain 5 53 47", "Sri_Lanka 50 6 5", "St.Lucia 26 67 71", "Syria 48 91 114", "Tajikstan 10 88 45", "Tanzania 40 26 85", "Thailand 78 72 51", "Togo 18 50 60", "Tonga 6 45 26", "Trinidad_and_Tobago 67 80 19", "Tunisia 52 95 80", "Turkey 61 22 37", "Turkmenistan 71 73 62", "Uganda 56 80 72", "Ukraine 35 21 34", "United_Arab_Emirates 72 33 98", "United_Kiongdom 60 93 77", "United_States_of_America 50 67 3", "Uruguay 62 56 58", "Uzbekistan 25 57 32", "Venezuela 26 91 67", "Vietnam 72 35 105", "Yemen 33 93 91", "Yugosl**ia 10 47 110", "Zaire 53 78 80", "Zambia 0 67 22", "Zimbabwe 77 81 93"};
            long start = System.currentTimeMillis();
            String[] rank = Medal.rankByBubble(countries);
            System.out.println("耗时:" + (System.currentTimeMillis() - start));
            for (int i = 0; i < countries.length; i++) {
                System.out.println(rank[i]);
            }
        }
    

    执行结果:
    耗时:12
    Mongolia
    Burma
    Saint_Vincent
    Belgium
    Thailand
    Zimbabwe
    Seychelles
    Kenya
    Burundi
    Australia
    Ethiopia
    Slovakia
    Iraq
    Vietnam
    United_Arab_Emirates
    Turkmenistan
    Croatia
    France
    Malawi
    Italy
    Ascension
    Reunion
    Jamaica
    Mozambique
    Albania
    Mali
    Trinidad_and_Tobago
    Brazil
    Algeria
    Cameroon
    Germany
    Chad
    Bolivia
    Papua_New_Cuinea
    Russia
    Panama
    Greece
    Liechtenstein
    Uruguay
    Netheriands_Antilles
    Costa_Rica
    Turkey
    Namibia
    Finland
    United_Kiongdom
    Benin
    Cyprus
    Kyrgyzstan
    Ghana
    Morocco
    Mariana_Is
    South_Africa
    Belize
    Netherlands
    Colombia
    Poland
    Burkina-faso
    Uganda
    Afghanistan
    Zaire
    Kuwait
    Tunisia
    Canada
    Liberia
    Bulgaria
    Saint_Lueia
    Samoa_Western
    United_States_of_America
    Sri_Lanka
    Bangladesh
    Syria
    Sierra_Leone
    Belarus
    Nepal
    Pakistan
    French_Guiana
    Libya
    Fiji
    Lesotho
    Iceland
    Moldova,Republic_of
    Guatemala
    Solomon_Is
    Bahrain
    Anguilla
    Czech_Republic
    Laos
    Slovenia
    EI_Salvador
    Sao_Tome_and_Principe
    Djibouti
    Tanzania
    Grenada
    North_Korea
    Madagascar
    Honduras
    Mauritius
    Saint_Kitts_and_Nevis
    Barbados
    Mexico
    New_Zealand
    Ukraine
    Dominica_Rep.
    Guyana
    Senegal
    Yemen
    Bahamas
    Peru
    Cook_Is.
    Macao
    Niger
    Japan
    San_Marino
    Malta
    Central_African_Republic
    China
    Hongkong
    Singapore
    Venezuela
    Gibraltar
    St.Lucia
    Brunei
    Bermuda_Is.
    Argentina
    Somali
    Nicaragua
    Romania
    Ivory_Coast
    Uzbekistan
    Congo
    Paraguay
    Lebanon
    Indonesia
    Cayman_Is.
    Hungary
    Guinea
    Samoa_Eastern
    Latvia
    Gambia
    Puerto_Rico
    Chile
    Togo
    Martinique
    Armenia
    Monaco
    Cuba
    Ireland
    Haiti
    Nauru
    Andorra
    Norway
    Kampuchea
    (Cambodia)
    Azerbaijan
    Georgia
    Gabon
    India
    Montserrat_Is
    Kazakstan
    Antigua_and_Barbuda
    Austria
    French_Polynesia
    Malaysia
    Tajikstan
    Ecuador
    Yugosl**ia
    Philippines
    Iran
    Luxembourg
    Denmark
    Qatar
    Maldives
    Saudi_Arabia
    Korea
    Tonga
    Spain
    Lithuania
    Guam
    Jordan
    Egypt
    Estonia
    Portugal
    Israel
    Zambia
    Angola
    Botswana
    Nigeria
    Oman

  • 相关阅读:
    嵌入式开发杂谈
    C#连接数据库
    C软件机密解密之动态跟踪
    navicat连接mysql8报错
    tomcat 服务版本内存设置
    python2/python3 升级pi版本
    各种源文件和目录
    Day 2 : 变量、JAVA基本类型、运算符和表达式1
    猜字母游戏
    Day 1 : 行业概述、JAVA开发环境
  • 原文地址:https://www.cnblogs.com/qujiayuan/p/12904682.html
Copyright © 2011-2022 走看看