C#基础排序算法总结:冒泡法、选择排序法、插入排序法精炼总结

以下示例都是从小到大进行排序。

一、冒泡法排序

过程:从第一个数据开始,比较该数据和右边的数据的大小,如果比右边数据大,就进行交换,依次进行直到最后。

对于每一次内层循环结束后的结果:都会在当前排序序列的最后一位产生一个最大的数。

        public static void BubbleSort(int [] arr)
        {
            for (int i = 0; i < arr.Length-1; i++)
            {
                for (int j = 0; j < arr.Length-1-i; j++)
                {
                    if (arr[j] > arr[j + 1])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
        }

注:所谓冒泡法,是指从小到大排列时,最小的数是渐渐冒到前面来的,而最大的数是每次内层循环结束直接产生的。

二、选择排序

过程:从第一个数据开始,按照“打擂台”算法,假定它是最小的一个数,去跟其他后面所有的数进行比较,如果有更小的数,就将那个数与我们假定的最小数进行交换,内层循环结束就得到一个当前序列的最小的一个数,然后将它放在前面。依次进行,直到最后。

对于每一次内层循环结束后的结果:都会产生当前序列的最小的一个数,然后将它放在前面,再从第二数进行上述步骤,循环后会得到第二小的数,以此类推。

        public static void SelectionSort(int[] arr)
        {
            for (int i = 0; i < arr.Length-1; i++)
            {
                //保留序号方便交换
                int minIndex = i;
                for (int j = i; j < arr.Length; j++)
                {
                    if (arr[j] < arr[minIndex])
                    {
                        minIndex = j;
                    }
                }
                //此时的j就是从i到最后整个序列中最小的数的序号
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }

三、插入排序

过程:从第二个数据开始,找该数据的前面的数据,如果前面的数据大于该数据,就让前面的数据向后移动(覆盖原本数据,原本数据用temp保存),直到第一个数据,最后再将temp数据放置在停止移动的位置那里,插入完成。

举例:例如有数据这样的数据:8,1,5,4,7。手动模拟插入排序的过程:第二个数1,用temp =1保存1的值,用j保存此时前面数据的位置,此时j=0(j对应的值是8),8>1,于是向后移动,序列变为8,8,5,4,7,此时移动结束,然后序列的第j位等于temp,变为1,8,5,4,7;开始第三个数5,此时temp=5,j=1,由于8>5,向后移动序列变为1,8,8,4,7,此时j位替换成temp得到1,5,8,4,7;开始第四个数......(后面省略,对照下面代码,然后自己手写一下,会很清楚)

        public static void InsertSort(int[] arr)
        {
            for (int i = 1; i < arr.Length; i++)
            {
                int j;//记录arr[i]该插入的位置
                int temp = arr[i];//保留arr[i]的值
                for (j = i-1; j >=0; j--)
                {
                    if (arr[j] > temp)
                    {
                        arr[j+1] = arr[j];
                    }
                    else
                    {
                        break;
                    }
                }
                //退出循环时多减了1,要加回来
                arr[j+1] = temp;
            }
        }

复杂度:平均是O(n^2)最好是O(n)。最好就是序列已经排好序,只做外层循环。

小结:这是几种比较基础的排序,理清每种排序的规则和原理很有必要。个人目前最喜欢选择排序,清晰明了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值