一.用lambda表达式构建的Comparison委托函数进行排序
1.基本示例
引用的库函数为:public static void Sort(T [ ] array, Comparison comparison)
Array.Sort(arr1, (x, y) =>
{
//如果左参数>右参数,即需要左参数在右参数的后面
if (x > y)
return 1;
//如果左参数<右参数,即需要左参数在右参数的前面
else if (x < y)
return -1;
//如果左参数=右参数,
else
return 0;
}
);
2.例题
题目
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在arr1 的末尾。
示例 1:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
示例 2:
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]
我的题解:
public int[] RelativeSortArray(int[] arr1, int[] arr2)
{
//键为 arr2[index] ,值为前者在数组中的下标index
Dictionary<int, int> arr2_dic = new Dictionary<int, int>(arr2.Length);
for (int i = 0; i < arr2.Length; i++)
{
arr2_dic.Add(arr2[i], i);
}
Array.Sort(arr1, (x, y) =>
{
//如果左参数>右参数,即需要左参数在右参数的后面
//如果 x 和 y 都在 arr2 里
if (arr2_dic.ContainsKey(x) && arr2_dic.ContainsKey(y)) {
return arr2_dic[x] - arr2_dic[y];
}
//如果 x 和 y 都不在 arr2 里
else if (!arr2_dic.ContainsKey(x) && !arr2_dic.ContainsKey(y)) {
return x - y;
}
//如果一个在一个不在
else {
return arr2_dic.ContainsKey(x) ? -1 : 1;
}
}
);
return arr1;
}
2.2545. 根据第 K 场考试的分数排序
我的题解:
public int[][] SortTheStudents(int[][] score, int k)
{
Array.Sort(score, (x, y) => y[k] - x[k]);
return score;
}
二.利用 IComparer 接口
1.基本示例
引用的库函数为:IComparer 接口
using System.Collections.Generic;
public class mySort : IComparer
{
int IComparer.Compare(System.Object x, System.Object y)
{
int a = (int)x;
int b = (int)y;
/*
如果左参数>右参数,即需要左参数在右参数的后面
return 1;
如果左参数<右参数,即需要左参数在右参数的前面
return -1;
如果左参数=右参数,
return 0;
*/
}
}
//或直接声明比较的数据的类型
public class mySort : IComparer<int>
{
int IComparer<int>.Compare(int x, int y)
{
if (x == y)
return 0;
else
return x > y ? -1 : 1;
}
}
//调用方式
void Start()
{
int[] arr = new int[] { };
Array.Sort(arr,new mySort());
}
2.例题
题目
给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。
对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names 。
示例 1:
输入:names = [“Mary”,“John”,“Emma”], heights = [180,165,170]
输出:[“Mary”,“Emma”,“John”]
示例 2:
输入:names = [“Alice”,“Bob”,“Bob”], heights = [155,185,150]
输出:[“Bob”,“Alice”,“Bob”]
我的题解:
public string[] SortPeople(string[] names, int[] heights)
{
Array.Sort(heights, names, new mySort_2418());
return names;
}
public class mySort_2418 : IComparer<int>
{
int IComparer<int>.Compare(int x, int y)
{
if (x == y)
return 0;
else
return x > y ? -1 : 1;
}
}