C#冒泡排序&&选择排序&&快速排序

/*编写一个程序,要求用户从键盘输入3个不同整数,输出中间者。 */

 Console.WriteLine("请同时输入多个数,用空格键隔开:");
            //输入的字符串
            string str = Console.ReadLine();
            //使用空格分隔成字符串数组
            string[] str1 = str.Split(' ');
            int[] number = new int[str1.Length];
            for (int i = 0; i < str1.Length; i++)
            {
               //强制转换成int 类型
                number[i] = Convert.ToInt32 (str1[i]);
            }
            //冒泡排序//
            for (int i = 0; i < number.Length-1; i++)
            {
                for (int j = 0; j < number.Length-1-i; j++)
                {
                    if (number[j + 1] < number[j])
                    {
                        int temp;
                        temp = number[j + 1];
                        number[j + 1] = number[j];
                        number[j] = temp;

                    }
                }
            }
            for (int i = 0; i < number.Length; i++)
            {
                Console.Write(" "+number[i]);
            }
            //输出中间值
            Console.WriteLine(number[number.Length / 2]);

选择排序

//选择排序
            //动态定义数组
            int[] arr_2 = new int[14] { 6, 7, 8, 5, 3, 6, 345, 345, 234, 123, 45, 67, 12, 4 };
            //局部变量
            int min;
            int minindex;

            for (int i=0;i<arr_2.Length-1;i++)
            {
                min = arr_2[i];//记录最小值
                minindex = i; //记录最小值的下标
                //再剩下的数组中寻找最小值与 min 比较
                for (int j = i+1; j < arr_2.Length; j++)
                {
                    if (min > arr_2[j])//比较值后,找最小值
                    {
                        min = arr_2[j];
                        
                        minindex = j;//记录其下标
                    }


                }
                //找到剩下数组中的最小值之后,与min交换
                arr_2[minindex] = arr_2[i];
                arr_2[i] = min;
               
            }
            //显示答应
            for (int i = 0; i < arr_2.Length; i++)
            {
                Console.Write("{0} ", arr_2[i]);
            }
            Console.WriteLine();

//快速排序

/*arr = {23,23,13,14,15,45,56}
*分割数  k=arr[0]=23    15  14  13  23  23  45  56    
*       通过划分  得到两部分   {15,14,13}  23  {23,45,56}
* 前一部分的分割数  k=arr[0]=15  {13,14} 15 23 {23,45,56}
* 后一部分的分割数  k=arr[4]=23  {13,14 } 15, 23, 23,{45,56}
* 之后再获取到分割数划分。。。。。。。
        */

        public static void Main(string[] args)
        {
            int[] arr = {23,23,13,14,15,45,56};
            QuickSort(arr,0,arr.Length-1);
            for (int i = 0; i < arr.Length;i++)
                Console.WriteLine(arr[i]);
        }
        //使用递归执行分割排序
        public static void QuickSort(int[] array,int startIndex,int endIndex)
        {
            if (startIndex > endIndex)
                return;
            int boundary = Boundary(array, startIndex, endIndex);
            //以当前找到的这个数的下标分割
            QuickSort(array,startIndex,boundary-1);
            QuickSort(array,boundary+1,endIndex);
        }
        //找到分割位置
        public static int Boundary(int[] array,int startIndex,int endIndex)
        {
            int standary = array[startIndex];
            //定义向左、向右的下标遍历的数
            int start = startIndex;
            int end = endIndex;

            while(end>start)
            {
                //指针从右到左扫描,先右后左这个顺序很重要
                while(start<end && array[end]>=standary)
                {
                    end--;
                }
                array[start] = array[end];
                //这时array[end]这个数的位置空出来了

                //指针从左到右扫描
                while(start<end && array[start]<standary)
                {
                    start++;
                }
                array[end] = array[start];
                //上面把array[end]这个空位填上了
            }
            //把end=start这个空位给分割数standary
            /*帮助理解
            array[start] = standary;
            Console.WriteLine("分割数:"+standary+"  小标:"+start);
            for (int i = 0; i <array.Length; i++)
                Console.Write(array[i]+"  ");
            Console.WriteLine();
            */
            //返回这个分割数的下标
            return start;
            //分割结束
        }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值