排序

字典序與數(shù)字序

?數(shù)字序:按照數(shù)值的大小進(jìn)行排序,比較數(shù)值本身的大小,數(shù)值大的排在后面;
?字典序:按照字符的ASCII碼順序逐字符比較,類似于字典的排序方式,從左到右逐個字符比較,如果當(dāng)前字符相同,比較下一個字符,如果所有字符都相同,較短的字符串排在前面。

穩(wěn)定排序與不穩(wěn)定排序

?排序算法的“穩(wěn)定性”指的是:在排序過程中,值相等的元素,在排序完成后,其原有的相對順序是否保持不變。
??穩(wěn)定排序:在排序完成后,值相等的元素 其原始相對順序保持不變。
??不穩(wěn)定排序:在排序完成后,值相等的元素 其原始相對順序可能被打亂。
?常見的排序算法中,歸并排序是穩(wěn)定排序,快速排序是不穩(wěn)定排序。

先降序后升序示例

?compareTo絕對安全,無溢出風(fēng)險。
?Integer 升序,a.compareTo(b),從小到大:1, 2, 3, 4
?Integer 降序,b.compareTo(a),從大到小:4, 3, 2, 1
?String 升序,s1.compareTo(s2),字典序:apple, banana
?String 降序,s2.compareTo(s1),反字典序:banana, apple

        Arrays.sort(people,new Comparator<int[]>(){
            public int compare(int[] person1, int[] person2) {
                if (person1[0] != person2[0]) {
                    //優(yōu)先按身高降序
                    return Integer.compare(person2[0],person1[0]);
                } else {
                    //身高相同則按k值升序
                    return Integer.compare(person1[1],person2[1]);
                }
            }
        });
Lambda寫法
Arrays.sort(people, (person1, person2) -> {
    if (person1[0] != person2[0]) {
        return Integer.compare(person2[0], person1[0]); // 身高降序
    } else {
        return Integer.compare(person1[1], person2[1]); // k值升序
    }
});

int[]的降序

int[] nums = {5, 2, 8, 1, 9};
Arrays.sort(nums);
// 然后反轉(zhuǎn)數(shù)組實現(xiàn)降序
for (int i = 0; i < nums.length / 2; i++) {
    int temp = nums[i];
    nums[i] = nums[nums.length - 1 - i];
    nums[nums.length - 1 - i] = temp;
}

List中String類型按字典序排序

    List<String> res = personMap.get("C");
    res.sort((a,b)->{
        return a.compareTo(b);
    });

集合按value排序示例

        //resMap.keySet()、resMap.values()分別獲取key的集合、value集合構(gòu)建一個List
        List<Integer> res = new ArrayList<>(resMap.keySet());
        ans.sort((a, b) -> {
            int freqCompare = resMap.get(b).compareTo(resMap.get(a));
            if (freqCompare == 0) {
                return a.compareTo(b);
            }
            return freqCompare;
        });

集合升序簡單排序

        Collections.sort(nums);
####集合按某一數(shù)據(jù)出現(xiàn)最高次數(shù)排序(mn構(gòu)造的id為第一個,總分為第二個方便獲取)
        Arrays.sort(mn, (a, b) -> {
        if (a[1] != b[1]) {
            return b[1] - a[1]; // 首先按總分降序
        } else {
            // 從最高分開始逐級比較
            for (int scoreLevel = 10; scoreLevel >= 0; scoreLevel--) {
                int countA = 0;
                int countB = 0;
        
                // 統(tǒng)計當(dāng)前分?jǐn)?shù)級別出現(xiàn)的次數(shù)
                for (int i = 2; i < m + 2; i++) {
                    if (a[i] == scoreLevel) countA++;
                    if (b[i] == scoreLevel) countB++;
                }
        
                // 如果當(dāng)前級別分?jǐn)?shù)出現(xiàn)次數(shù)不同,按次數(shù)降序
                if (countA != countB) {
                    return countB - countA;
                }
            }
    
            return a[0] - b[0];
        }
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容