- 至于为什么要从右边找小于基准值的数呢:
因为右边的数都应该大于基准值,小于基准值的数就相当于是异族,要清除异己。 - 还有个问题就是为什么要从右边先开始。
假设有这样一种情况:
我选最左边一个数2做基准值,先从左边开始检测找到一个6,然后右边开始找,一直找都没找到小于2的数,最后在6处相遇了,这种情况显然是存在的。
相遇后会停下来将6与2交换,然后6在最左边,2在6的右边某位置。
就像这样:
6…2…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);
}
}
}
能够输出每次排序后的结果: