快速排序采用的分治法。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
先把第一个数72作为基数,然后从后往前遍历找到比72小的,48放72的位置,然后从前往后遍历找到比72大的放原来48的位置。遍历结束之后72跑到了红88的位置。
记录下当前从后往前和从前往后分别遍历的位置
然后再从后往前遍历找到比72小的,放72的位置, 从前往后遍历找比72大的放72的位置
class Program
{
/// <summary>
/// 对数组dataArray中索引从left到right之间的数做排序
/// </summary>
/// <param name="dataArray">要排序的数组</param>
/// <param name="left">要排序数据的开始索引</param>
/// <param name="right">要排序数据的结束索引</param>
static void QuickSort(int[] dataArray, int left, int right)
{
if (left < right)
{
int baseValue = dataArray[left];//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
int leftIdex = left;
int rightIndex = right;//用来做循环的标志位
while (true && leftIdex < rightIndex)//leftIdex==rightIndex,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置
{
//从后往前比较(从右向左比较) 找一个比基数小(或者=)的数字,放在我们的坑里 坑位于i的位置
while (true && leftIdex < rightIndex)
{
if (dataArray[rightIndex] <= baseValue)
{
//找到了一个比基准数 小于或者等于的数子,应该把它放在leftIdex的左边
dataArray[leftIdex] = dataArray[rightIndex];
break;
}
else
{
rightIndex--;//向左移动 到下一个数字,然后做比较
}
}
//从前往后(从左向右)找一个比baseValue大的数字,放在我们的坑里面 现在的坑位于rightValue的位置
while (true && leftIdex < rightIndex)
{
if (dataArray[leftIdex] > baseValue)
{
dataArray[rightIndex] = dataArray[leftIdex];
break;
}
else
{
leftIdex++;
}
}
}
//跳出循环 现在i==j i是中间位置
dataArray[leftIdex] = baseValue;// left -i- right
QuickSort(dataArray, left, leftIdex - 1);
QuickSort(dataArray, leftIdex + 1, right);
}
}
static void Main(string[] args)
{
int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
QuickSort(data, 0, data.Length - 1);
foreach (var temp in data)
{
Console.Write(temp + " ");
}
Console.ReadKey();
}
}
}