北川广海の梦

北川广海の梦

重温快速排序

578
2020-03-24

快速排序是一种交换排序的方法。
首先选取一个基数,作为分界,然后将数组中的元素与基数进行比较。
将比基数小的放在左边,比基数小的放在右边。
就能得到以基数为界限的两个子部分
然后对两个子部分,分别进行相同的递归即可。

 public static void FastSort(int[] nums)
        {
            Sort(nums, 0, nums.Length - 1);
        }

 private static void Sort(int[] nums, int low, int high)
        {
            if (low >= high) return;//当哨兵位置交叉则说明此部分已经只有一个元素,返回。
            int start = low;
            int end = high;//保存子部分的界限,以便确定下一次递归的哨兵位置;
            int center = nums[low];//以低位哨兵所在的数为基准;
            int indexOfCenter = low;//记录基准数的当前位置;
            bool findLower = true;//标识当前是在寻找较小数还是较大数
            for (; low != high;)
            {
                if (findLower)
                {
                    if (nums[high] <= center)//小于等于基数的放左边
                    {
                        nums[indexOfCenter] = nums[high];
                        nums[high] = center;
                        indexOfCenter = high;
                        findLower = false;//本次较小数寻找完成,下一次将寻找较大数
                    }
                    else//继续寻找
                    {
                        high--;
                        continue;
                    }

                }
                else
                {
                    if (nums[low] > center)//大于基数的放右边
                    {
                        nums[indexOfCenter] = nums[low];
                        nums[low] = center;
                        indexOfCenter = low;
                        findLower = true;//本次较大数寻找完成,下一次将寻找较小数
                    }
                    else//继续寻找
                    {
                        low++;
                        continue;
                    }
                }

            }
            //划分为左右两个部分
            Sort(nums, start, indexOfCenter - 1);//左边子部分以当前部分的开始位置为左界限,以基数位置-1为右界限
            Sort(nums, indexOfCenter + 1, end);//右边子部分以以基数位置+1为左界限,以当前部分的结束位置为右界限
        }