重温快速排序
582
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为左界限,以当前部分的结束位置为右界限
}
- 0
- 0
-
分享