三大基本排序--选择、冒泡、插入

引言:

    老师已经是第三次跟我们讲排序了,可想而知排序它的重要性,这三种基本排序的方式值得我们思考和研究,理解其中的思想。

简述:

  概念:

  将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序

 常见排序算法:

  快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。


选择排序:

   原理:

   将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,假设现在A[0]是最小的,将剩余的元素与其进行比较,如果比A[0]大,则互换位置,如果比A[0]小则不动,这样第一轮就轮完了,找到了最小的元素;第二轮,假设A[1]是次小的,将剩余的元素与其比较,找到次小的元素放到A[1]位置,依次进行下去,经过n-1轮排序,顺序就排好了。

示图:

    

代码实现:

 class 选择排序
    {
        //定义一个数组
        static List<int> list = new List<int>() { 48, 15, 26, 82, 65 };
        static void Main(string[] args)
        {
            //调用排序方法
            Choice();
            PrintList ();
        }
        //选择排序
        static void Choice()
        {
            //定义变量temp 和minIndex都为0
            int temp = 0;
            int minIndex = 0; //数组中最小数的下标
            for (int i = 0; i < list .Count ; i++)
            {
                minIndex = i;  //标记此下标为最小值
                for (int j = i+1; j < list .Count ; j++)
                {
                    //依次和数组中其他数据进行比较,如果其他数据比当前标记的数值小,则把较小数值的下标赋给minIndex
                    if (list[j]<list[minIndex])
                    {
                        minIndex = j;
                    }     
                 }
                //交换数据
                temp = list[minIndex];
                list[minIndex] = list[i];
                list[i] = temp;
            }
        }
        private static void PrintList()

        { 
            foreach (var item in list)
            {
                Console.WriteLine(string.Format("{0}", item));
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }

效果:



冒泡排序:

 原理:

  将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,相邻的两个元素进行比较,则较大的数放到后面,这样一轮结束后最大的元素就放到了最后位置,依次进行,n-1轮之后,顺序就排好了。

  示图:

    

代码实现:

  class 冒泡排序
    {
        //定义一个数组
        static List<int> list = new List<int>() { 48, 15, 7, 34, 25 };
        static void Main(string[] args)
        {
            //调用排序方法
            Bubble();
            PrintList();
        }
        //冒泡排序
        static void Bubble()
        {
            //定义临时变量
            int temp = 0;
            for (int i = list.Count; i > 0; i--)
            {
                for (int j = 0; j < i-1; j++)
                {
                    //相邻的两个数进行比较,把较大的数放到后面
                    if (list[j] >list[j+1])
                    {
                        //交换数据
                        temp = list[j];
                        list[j] = list[j+1];
                        list[j+1] = temp;
                    }
                }             
            }
        }
        private static void PrintList()
        {
            foreach (var item in list)
            {
                Console.WriteLine(string.Format("{0}", item));
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }

  效果:




插入排序:

  原理:

  给定序列,存在一个分界线,分界线的左边被认为是有序的,分界线的右边还没被排序,每次取没被排序的最左边一个和已排序的做比较,并插入到正确位置。(从小到大)

 示图:

    

代码实现:

class 插入排序
    {
        //定义一个数组
        static List<int> list = new List<int>() { 48, 15, 7, 34, 25 };
        static void Main(string[] args)
        {
            //调用排序方法
            Insert();
            PrintList();
        }
        //插入排序
        static void Insert()
        {           
            for (int i=1;i <list.Count;i++)
            {
                //定义临时变量
                int temp = list[i];
                int j = i;
                //如果在已经排好序的数列段中没有找到比新值小的数
                while (j>0 && temp <list [j-1])
                {
                    //将比新数值大的数向后移
                    list[j] = list[j - 1];
                    j--;
                }
                //如果在已经排好序的数列中找到比新数小的数值,将数值替换到此位置 
                list[j] = temp;
            }
        }
        private static void PrintList()
        {
            foreach (var item in list)
            {
                Console.WriteLine(string.Format("{0}", item));
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }

  效果:


   


比较:

 一张图胜过千言万语。

    







总结:

1.思想上移,行动下移。

2.实践了才知道是否正确





评论 74
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值