四种常见的排序(冒泡、简单选择、直接插入、快速)

  • Post author:
  • Post category:其他


1、冒泡排序

 static void BubBlingSort(params int[]array )//参数数组
        {
            for (int i = 0; i < array.Length-1; i++)//冒泡的轮数
            {
                bool a = true;//定义一个bool值
                for (int j = 0; j < array.Length-1-i; j++)//依次遍历数组的数
                {                   
                    if (array[j]>array[j+1])//如果前一个数比后面的数大则交换位置
                    {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                        Console.WriteLine("kkkkk");//测试bool值有没有起到作用
                        a = false;//当交换了位置,则把bool值a赋值为false
                    }                  
                }
                if (a)//判断a是不是true,如果是的话则跳出循环
                {
                    break;
                }
            }
            foreach (var item in array)//遍历输出数组
            {
                Console.Write(item+",");
            } 
        }

2、直接插入排序

 static void InsertSort(params int[]array)//参数数组
        {
            for (int i = 1; i < array.Length; i++)//依次遍历数组
            {
                int num = array[i];//把每次遍历到的值赋给num
                bool a = false;//初始化一个bool值a等于false
                for (int j = i-1; j >= 0; j--)//从0号位开始
                {
                    //2,8,4
                    if (array[j]>num)//判断前一位和后一位的大小
                    {
                        array[j + 1] = array[j];//如果前面的数大于后面的数则把前面的数跟后面的数换位置
                    }
                    else//如果前面的数小于或者等于后面的数
                    {
                        array[j+1] = num;//则将这个数直接插入后一位
                        a = true;//插入了赋值a位true
                        break;//跳出循环
                    }
                }
                if (a==false)//判断有没有插入的操作 无操作为false
                {
                    array[0] = num;//如果没有就直接赋值给0号位
                }
            }
            foreach (var item in array)
            {
                Console.Write(item+",");
            }
        }

3、快速排序


1.将数组第一个数作为基准数

2.从右向左遍历找到一个比基准数小的数放到i的位置上

3.从左往右遍历找到一个比基准数大的数放到j的位置

4.i和j重叠的时候将基准数放入碰头位置通俗一点讲:把最左边的数作为准基数,然后从最右边开始找比这个准基数小的数,如果找到了就把这个数放到0号位,然后从这个数的后一位号找比这个准基数大的数放到刚刚准基数的位置上没找到则这个准基数就是最小的数,此时把第二个数作为准基数,从最右边往左边开始找一个比准基数小的数把这个数放到准基数之前的位置上,然后从左往右找一个比准基数大的数,将它放到空缺的位置上,依此类推。

 static void QuickSort( int[]array,int left,int right)//参数数组
        {
            if (left<right)
            {
                int i = left;//数组最左边
                int j = right;//数组最右边
                int x = array[left];//基准数
                while (i<j)//满足此条件
                {
                    while (i<j)
                    {
                        if (array[j]<x)//如果最右边的数小于x
                        {
                            array[i] = array[j];//把最右边的数赋值给0号位
                            break;//退出循环
                        }
                        else//如果最右边的数大于或者大于x
                        {
                            j--;//则判断前一位
                        }
                    }
                    while (i<j)
                    {
                        if (array[i]>x)//如果最左边的数大于x
                        {
                            array[j] = array[i];//则把这个数赋值给最右边的数
                            break;//退出循环
                        } 
                        else//如果最左边的数小于x
                        {
                            i++; //则判断后一位的数
                        }
                    }
                }
                array[i] = x;//把每一次的x值赋值给i号位
                //将这个数组以准基数为中心分割为两个数组
                //准基数是当i和j相交时的数
                QuickSort(array,left,i-1);//从数组的左边到准基数的号位左边一位
                QuickSort(array,i+1,right);//从准基数的号位右边一位到数组的右边
            }
        }

4、简单选择排序

从第一个数开始和其后面的所有数进行比较,选择最小的数将其放入0号位

 static void SelectSort(params int[]array)//参数数组
        {
            for (int i = 0; i < array.Length-1; i++)//依次遍历数组
            {
                int min = array[i];//将每一次i号位的值给min
                int minindex =i;//将i给minindex,作为索引值
                for (int j = i; j < array.Length; j++)
                {
                    if (array[j]<min)
                    {
                        min = array[j];//每一次的最小值给到min
                        minindex = j;//每一次最小值的索引给到minindex
                    }
                }
                //交换位置,把获取到的最小值的索引拿到,然后根据索引将这个数和它对应的位置进行互换
                int temp = array[i];
                array[i] = array[minindex];
                array[ minindex] = temp;
            }
            foreach (var item in array)
            {
                Console.Write(item+",");
            }
        }



版权声明:本文为qq_59943770原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。