快速排序(C#)

  • 至于为什么要从右边找小于基准值的数呢:
    因为右边的数都应该大于基准值,小于基准值的数就相当于是异族,要清除异己。
  • 还有个问题就是为什么要从右边先开始。
    假设有这样一种情况:
    我选最左边一个数2做基准值,先从左边开始检测找到一个6,然后右边开始找,一直找都没找到小于2的数,最后在6处相遇了,这种情况显然是存在的。
    相遇后会停下来将6与2交换,然后6在最左边,2在6的右边某位置。
    就像这样:
    62…9…
    这显然违反了设计的初衷。 (初衷是什么呢?是在i,j相遇后,将相遇处的值和基准值交换顺序,形成的效果是以基准值为界限,基准值左侧都小于基准值,基准值右边都大于基准值)
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0, r = 9;
            student stu = new student(); 
            stu.kuaipai(0, 9);
            //foreach (var item in stu.a)
            //{
            //    Console.WriteLine(item);
            //}
        }
    }
    class student
    {
        public int[] a = new int[10] { 5,4, 6, 3, 13, 7, 2, 1, 8, 10 };
        public void  kuaipai(int left, int right)
        {
            if (left >= right)
                return ;
            int i = left, j = right;
            int n = a.Length;
            //在这个大循环里,他的目标是从右边找小于基准值的数,从左边找大于基准的值然后交换一直找一直换
            while (true)
            {
                //这里面的两个小循环分别是从右边找小于基准值的数,从左边找大于基准的值
                while (true)
                {
                    if (a[j] < a[left] || j == i) 
                        break;
                    j--;
                }
                while (true)
                {
                    if (a[i] > a[left] || j == i)
                        break;
                    i++;
                }
                int m;
                if (j == i)
                {
                    m = a[i];
                    a[i] = a[left];
                    a[left] = m;
                    foreach (var item in a)
                    {
                        Console.Write(item.ToString()+" ");
                    }
                    Console.WriteLine();
                    break;//当左右碰到一起的时候,一次大循环结束
                }
                else
                {
                    m = a[j];
                    a[j] = a[i];
                    a[i] = m;
                    foreach (var item in a)
                    {
                        Console.Write(item.ToString() + " ");
                    }
                }
                
                Console.WriteLine();
            }
            kuaipai(left, i - 1);
            kuaipai( i + 1,right);
        }
    }
}



能够输出每次排序后的结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值