【Java】Array.sort() 方法

一、Arrays.sort() 四种重载方法

1.1 Arrays.sort(T[] a)

对一个数组a中全部元素按升序排序

1.2 Arrays.sort(T[] a, int fromIndex, int toIndex)

对一个数组a中下标为 fromIndex 到 toIndex - 1的元素升序排序。

1.3 Arrays.sort(T[] a, Comparator<? super T> c)

//降序
Integer[] arr = {....};
//写法一
Arrays.sort(arr, new Comarator<Integer>() {
	public int compare(Integer a, Integer b) {
		return b - a;
	}
});
//写法二
Arrays.sort(arr, (a, b) -> b - a);

注意:自定义排序内是相减,int边界上的值相加减不一定在int范围内
根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。

场景:给定两个数组,int A[],int B[]。排序按A升序,相同则按B升序。

var ids = new Integer[n];
for (int i = 0; i < n; i++)
	ids[i] = i;
Arrays.sort(ids, (i, j) -> A[i] != B[j]? A[i] - A[j]: B[i] - B[j]);

ids内元素为A数组对应的元素值排序结果。

1.4 Arrays.sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c)

根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。

二、Arrays.sort() 方法中的排序算法

主要涉及三种排序算法:双轴快速排序(DualPivotQuicksort)、归并排序(MergeSort)、TimSort,同时也包含一些非基于比较的排序算法:例如基数排序
具体使用哪种排序算法需要根据类型、输入长度来动态抉择。

2.1 基础数据类型

采用 双轴快速排序基数排序

public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

2.2 包装类型

采用归并排序TimSort,默认采用TimSort

public static void sort(Object[] a) {
    if (LegacyMergeSort.userRequested)
      legacyMergeSort(a);
  else
    ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}
 
public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null) {
        sort(a);
  } else {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
    else
       TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
}
 
/** To be removed in a future release. */
 private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
  T[] aux = a.clone();
  if (c==null)
      mergeSort(aux, a, 0, a.length, 0);
  else
    mergeSort(aux, a, 0, a.length, 0, c);
  }
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值