C# 排序的多种实现方式(经典)

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 排序的多种实现方式(经典)相关的知识,希望对你有一定的参考价值。

    排序是我们编程时的常用操作,实现方式也有很多种,本篇文章列举几种我常用的用法,希望对大家有用!

01

数组排序

最常见的排序是对一个数组排序,比如:

int[] aArray = new int[8]  18, 17, 21, 23, 11, 31, 27, 38 ;

第一种:我们最熟悉的冒泡排序法:即每个值都和它后面的数值比较,每次拿出最小值

static void Main(string[] args)
        
            int[] aArray = new int[8]  18, 17, 21, 23, 11, 31, 27, 38 ;
            for (int j = 0; j < aArray.Length - 1; j++)
            
                for (int i = 0; i < aArray.Length - 1; i++)
                
                    if (aArray[i] > aArray[i + 1])
                    
                        int temp = aArray[i];
                        aArray[i] = aArray[i + 1];
                        aArray[i + 1] = temp;
                    


                
            




            foreach (var a in aArray)
            
                Console.Write($"a ");
            
            Console.ReadKey();
        

运行结果:

第二种:利用Array.Sort排序:

① 升序排列:

static void Main(string[] args)
        
            int[] aArray = new int[8]  18, 17, 21, 23, 11, 31, 27, 38 ;
            Array.Sort(aArray);


            foreach (var a in aArray)
            
                Console.Write($"a ");
            
            Console.ReadKey();
        

运行结果:

② 降序排列:先升序排列,然后对数组反转

static void Main(string[] args)
        
            int[] aArray = new int[8]  18, 17, 21, 23, 11, 31, 27, 38 ;
            Array.Sort(aArray);
            Array.Reverse(aArray);


            foreach (var a in aArray)
            
                Console.Write($"a ");
            
            Console.ReadKey();
        

运行结果:

02


List排序

大多数时候,我们需要将list集合里面的数据进行排序,

① 如果list直接放置的数值类型的数据就比较简单,比如:

List<int> aList = new List<int>  18, 17, 21, 23, 11, 31, 27, 38 ;

方法一:利用List<T> 自带的Sort排序方法 

-. 升序排列:

aList.Sort();

降序排列:

aList.Sort();
            aList.Reverse();

-. sort也可以用如下方式操作:

list.Sort((a, b) => a.CompareTo(b));//升序
list.Sort((a, b) => b.CompareTo(a));//降序

方法二:利用List的OrderBy与OrderByDescending方法

升序排列:

List<int> aList = new List<int>  18, 17, 21, 23, 11, 31, 27, 38 ;
            aList = aList.OrderBy(a => a).ToList();

降序排列:

List<int> aList = new List<int>  18, 17, 21, 23, 11, 31, 27, 38 ;
            aList = aList.OrderByDescending(a => a).ToList();

方法三:利用link,这种感觉和方法二是一回事

List<int> aList = new List<int>  18, 17, 21, 23, 11, 31, 27, 38 ;
 aList = (from a in aList orderby a ascending select a).ToList();//升序
 aList = (from a in aList orderby a descending select a).ToList();//降序

②如果list存放的是一个类型,比如:

方法一: 一个集合存放学生的信息,按照学生的成绩升序排列:这里列举了2种方法,方法一注释了

static void Main(string[] args)
        
            List<Student> stuList = new List<Student>
            
                new Student() name = "zyr", age = 23, score = 99,
                new Student() name = "zls", age = 25, score = 95,
                new Student() name = "zsq", age = 27, score = 100,
                new Student() name = "zlw", age = 15, score = 69,
                new Student() name = "ywe", age = 17, score = 72,
                new Student() name = "asw", age = 29, score = 58
            ;


            //方法1 升序
            //stuList.Sort((x, y) => x.score.CompareTo(y.score));
            //方法2 升序
            stuList = stuList.OrderBy(stu=>stu.score).ToList();


            foreach (var stu in stuList)
            
                Console.WriteLine($"stu");
            
            Console.ReadKey();
        


        public class Student
        
            public string name  get; set; 
            public int age  get; set; 
            public int score  get; set; 


            public override string ToString()
            
                return $"姓名是:name,年龄是:age,得分是:score";
            
        

运行结果:

方法二: 加入这个学生成绩有重复的,对于重复的成绩按照年龄再排序:这里列举了2种方法,方法一注释了

static void Main(string[] args)
        
            List<Student> stuList = new List<Student>
            
                new Student() name = "zyr", age = 23, score = 99,
                new Student() name = "zls", age = 25, score = 95,
                new Student() name = "zls", age = 22, score = 95,
                new Student() name = "zsq", age = 27, score = 100,
                new Student() name = "zlw", age = 15, score = 69,
                new Student() name = "ywe", age = 17, score = 72,
                new Student() name = "asw", age = 29, score = 58,
                new Student() name = "ywe", age = 18, score = 72,
                new Student() name = "zsq", age = 16, score = 100,
            ;


            //方法1 升序
            //stuList.Sort((x, y) =>
            //
            //    int ret = x.score.CompareTo(y.score);
            //    if (ret == 0)
            //    
            //        return x.age.CompareTo(y.age);
            //    
            //    else
            //    
            //        return ret;
            //    
            //);
            //方法2 升序
            //stuList = stuList.OrderBy(stu=>stu.score).ThenBy(stu => stu.age).ToList();


            foreach (var stu in stuList)
            
                Console.WriteLine($"stu");
            
            Console.ReadKey();
        


        public class Student
        
            public string name  get; set; 
            public int age  get; set; 
            public int score  get; set; 


            public override string ToString()
            
                return $"姓名是:name,年龄是:age,得分是:score";
            
        

以上是关于C# 排序的多种实现方式(经典)的主要内容,如果未能解决你的问题,请参考以下文章

经典十大排序算法(含升序降序,基数排序含负数排序)Java版完整代码建议收藏系列

C# 入门算法“冒泡排序“ 升序 降序 最大值 最小值 平均值

C# 入门算法“冒泡排序“ 升序 降序 最大值 最小值 平均值

C# 入门算法“冒泡排序“ 升序 降序 最大值 最小值 平均值

C# LINQ 匿名类 动态排序

函数指针作为函数參数,实现冒泡排序的升序排序和降序排序