基本示例
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()); }