算法——快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public static int sortUnit(int[] Array, int low, int high)
        {
            int key = Array[low];
            while (low < high)
            {
                //从后往前找比key小的值 因为这里是while循环去判断 因此不能像下面这样写 不然low一直是不变的
                //while(Array[high] < key && low < high)
                //{
                //--high;
                //}

                //从后往前找比key小的值
                //比key大的就让high--
                while (Array[high] >= key && low < high)
                {
                    //--high;
                    Console.WriteLine(high+"开始high");
                    high--;
                    Console.WriteLine(high + "结束high");
                }
                //比key小的就赋值
                Array[low] = Array[high];
                Console.WriteLine(low+"low是几");
                //从前往后找比key大的值
                //比key小的就++low
                while (Array[low] <= key && low < high)
                {
                    //++low;
                    Console.WriteLine(low+"开始low");
                    low++;
                    Console.WriteLine(low + "结束low");
                }
                //比key大的就赋值
                Array[high] = Array[low];
                Console.WriteLine(high+"High是几");
            }
            //此时low = high 左边都比key小  右边都比key大 
            //将关键key放到游标当前位置
            Array[low] = key;
            //返回key的索引
            return high;
        }
public static void Sort(int[] Array, int low, int high)
        {
            if (low >= high)
            {
                return;
            }
            int index = sortUnit(Array, low, high);
            Sort(Array, low, index - 1);
            Sort(Array, index + 1, high);
        }
static void Main(string[] args)
        {
            int[] demo = new int[] { 0, 5, 3, 1, 2 };
            //6 2 5 3 1
            Sort(demo, 0, demo.Length - 1);
            foreach (var item in demo)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

划重点:为什么不在While循环那里判断Array[high] <= key来直接获得从后往前找 比key小的值?是因为如果那么做那么Array[low] = Array[high]的时候 Array[low]会一直不变 一直改变的是Array[low]的值 。所以这里使用逆向思维 找比key大的值 然后high–。值得思考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值