C#的排序算法

  1. 冒泡排序
    分为趟数和次数,元素之间两两比较交换,比较Length-1趟,每趟比较Length-1-i次,每次比较按照升序或降序的规则,交换顺序
    数据:9531315612–>1112335569
    for(int i=0;i<number.Length-1;i++)
        {
            for{int j=0;j<number.Length-1-i;i++}
                {
                    if(num[j]>num[j+1])//交换顺序
                    {
                        int temp=0;
                        temp=number[j];
                        num[j]=num[j+1];
                        num[j+1]=temp;
                    }
                }
}
  1. 选择排序
    每趟拿一个元素与后面的元素比较,找到最大值,记录最大值索引下来,每趟比较结束后在交换
    原始数据
    72 54 59 30 31 78 2 77 82 72–》82 78 77 72 72 59 54 31 30 2
for(int i=0;i<arr.Length-1;i++)//比较N趟
{
    int index=i;//记录最大值索引
    for(int j=i+1;j<arr.Length;i++)//每趟比较N次
    {
        if(arr[index]<arr[j])
        {
        index=j;
        }
    }
    //每趟比较完毕后让最大值与arr[i]交换顺序
    int temp=0;
    temp=arr[i];
    arr[i]=arr[index];
    arr[index]=temp;
}

3.插入排序:
假设最大值为数组的第一个元素,for循环,与后面的每个元素比较找到最大值

    forint i=1;i<length-1;i++)
    {
        int index=i;
        int temp=num[i];
        while(i>0&&num[i-1]>num[i])
        {
            num[i]=num[i-1];
        }
            num[i]=temp;
    }

4..List《T》排序对象排序–>List里存储的是对象—>接口排序
定义类

public class DDZ_Card
{
    public int value;//牌值
    public string color;//花色
}
一:实现IComparable接口
public class DDZ_Card:IComparable
{
    public int value;//牌值
    public string color;//花色
    //实现接口
    public int CompareTo(object obj)
    {
        DDZ_Card card = obj as DDZ_Card;
        return value.CompareTo(card.value);//
    }
}
二:实现,IComparer泛型接口
public class DDZ_Card:IComparer
{
    public int value;//牌值
    public string color;//花色
    //实现接口
    public int Compare(object x, object y)
    {
        DDZ_Card card1 = x as DDZ_Card;
        DDZ_Card card2 = y as DDZ_Card;
        if (card1.value > card2.value)
            return 1;
        else
            return -1;
    }
}
三:通过List.Sort的 public void Sort(Comparison<T> comparison)方法
 /// <summary>
    /// 卡牌排序
    /// </summary>
    /// <param name="cards"></param>
    /// <param name="asc">是否升序</param>
    public static void CardSort(List<DDZ_Card> cards, bool asc=true)
    {
        cards.Sort((DDZ_Card a,DDZ_Card b) => {
            if (asc)//升序
            {
                return a.value.CompareTo(b.value);
            }
            else//降序
            {
                return -a.value.CompareTo(b.value);
            }
        });
    }

5.List《T》排序–>Linq排序
一:使用Lambda表达式排序:
①:通过筛选条件,找到满足条件的集合

    /// <summary>
    /// 癞子排序
    /// </summary>
    /// <param name="keylist"></param>
    /// <returns></returns>
    private List<int> LaiziSqrt(List<int> keylist)
    {
        List<int> templist = new List<int>(keylist);
        if (MJManager.laizi != -1)//MJManager.laizi是Int类型的值,默认-1
        {
            List<int> templaizi = templist.Where(x => x == MJManager.laizi).ToList();//找到集合中所有赖子,存入新的集合中
            List<int> newlist = templist.Where(x => x != MJManager.laizi).ToList();//找到集合中所有非赖子,存入新集合中
            newlist.Sort();//非赖子集合排序
            templaizi.AddRange(newlist);//在赖子集合末尾添加非赖子集合
            return templaizi;
        }
        return templist;
    }

②:通过OrderBy(升序)和OrderByDescending(降序)对元素集合排序

public List<Card> Sort(List<Card> card)
{
    return card..OrderBy(x => x.value).ToList<Card>();//按照Value升序排序
}

 public List<DDZ_Card> KK(List<DDZ_Card> cc)
 {
     return cc.OrderByDescending(x => x.value).ToList<DDZ_Card>();//通过键值降序排序
 }
多字段主次顺序排序情况,先按no排序,再按name排序
List<Student> stuList= stu.OrderBy(s=> s.stuNO).ThenBy(s=> s.stuName).ToList<Student>();

猜你喜欢

转载自blog.csdn.net/baidu_39447417/article/details/79861252