C# 利用 Comparison 或 IComparer 对数组进行排序

一.用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.例题

1.力扣: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;
    }

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.例题

力扣:2418. 按身高排序

题目

给你一个字符串数组 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;
            }
        }

三.其他说明

  1. Array.Sort() 采用内省排序(introspective sort)参考链接
  2. 这两篇文章的末尾提到了多种利用库函数对集合进行排序的方式:参考链接1参考链接2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值