基本示例
Array.Sort(arr1, (x, y) =>
{
//如果左参数>右参数,即需要左参数在右参数的后面
if (x > y)
return 1;
//如果左参数<右参数,即需要左参数在右参数的前面
else if (x < y)
return -1;
//如果左参数=右参数,
else
return 0;
}
);
进阶例题
力扣:1122. 数组的相对排序
题目
给你两个数组,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;
}
上述题解引用的库函数为:public static void Sort(T[] array, Comparison comparison)
其他说明
- Array.Sort() 采用内省排序(introspective sort)参考链接
- 这两篇文章的末尾提到了多种利用库函数对集合进行排序的方式:参考链接1、参考链接2
- 第二点提到的排序有“通过IComparer对集合排序”,基本示例:
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;
*/
}
}
//调用方式
void Start()
{
int[] a = new int[] { };
Array.Sort(a,new mySort());
}