LintCode多关键字排序

描述 给定 n 个学生的学号(从 1 到 n 编号)以及他们的考试成绩,表示为(学号,考试成绩),请将这些学生按考试成绩降序排序,若考试成绩相同,则按学号升序排序。

样例1

输入: array = [[2,50],[1,50],[3,100]]
输出: [[3,100],[1,50],[2,50]]

样例2

输入: array = [[2,50],[1,50],[3,50]]
输出: [[1,50],[2,50],[3,50]]

思路:多关键字排序指的是:当主关键字相等时,用次关键字进行排序判断 排序采用的是冒泡排序法

public class Solution {

    /**

     * @param array: the input array

     * @return: the sorted array

     */

    public int[][] multiSort(int[][] array) {

        // Write your code here

        int[][] resultArray=sortStudents(array);

        return resultArray;

    }

public int[][] sortStudents(int[][] array) {

    if (array == null || array.length == 0) {

            return array;

        }

     int n=array.length;

    for(int i=0;i

    {

        for(int j=1;j

            {

                if (array[j][1] > array[j - 1][1]) {  // 成绩降序排序

                    swap(array, j, j - 1);

                } else if (array[j][1] == array[j - 1][1] && array[j][0] < array[j - 1][0]) {  

                    swap(array, j, j - 1);  // 成绩相同,学号升序

                }

            }

    }

    return array;

}  

    // 交换数组元素

    private void swap(int[][] array, int i, int j) {

        int[] temp = array[i];

        array[i] = array[j];

        array[j] = temp;

    }

}

如果不好理解 或者代码太长 尤其是边界值的问题 推荐使用java1.8+的Arrays.sort()方法进行排序

代码如下

import java.util.Arrays;

public class Solution {
    /**
     * @param array: the input array
     * @return: the sorted array
     */
    public int[][] multiSort(int[][] array) {
        Arrays.sort(array, (a, b) -> {
            if (a[1] != b[1]) {
                return b[1] - a[1]; // 成绩降序
            } else {
                return a[0] - b[0]; // 学号升序
            }
        });
        return array;
    }
}

需要注意的是 Arrays.sort() 对二维数组进行排序时,每一行的比较逻辑都需要返回一个整数值,来告诉排序算法两个元素的相对顺序

Arrays.sort(array, comparator) 中,比较器 Comparator 要实现如下逻辑

// 比较两个元素 a 和 b
compare(a, b) 返回:
    - 负数:a 排在 b 前
    - 0:a 和 b 相等(保持原顺序)
    - 正数:a 排在 b 后
Arrays.sort内部以TimSort为基础进行实现的 

    TimSort 是一种 混合排序算法,它结合了:

    归并排序(Merge Sort) 的稳定性和适合大数据的性能

    插入排序(Insertion Sort) 在小数据时的高效率

    而整体复杂度也是 O(n log n)

    你可能感兴趣的:(数据结构,算法,多关键字排序)