快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
快速排序的平均时间复杂度是O(nlogn),且它是一种不稳定的排序
快速排序使用分治法来把一个数组分为两个子数组。具体算法描述如下:
从数列中挑出一个元素,称为 “基准”(X);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

/*快速排序的平均时间复杂度是O(nlogn),且它是一种不稳定的排序*/
/// <summary>
/// 快速排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="left">数组要排序部分的左端</param>
/// <param name="right">数组要排序部分的右端</param>
static void QuickSort(int[] array, int left, int right)
{
if (left < right)
{
int x = array[left];//选取一个数作为基准数,一般就选择数组中的第一个数作为基准数
int i = left;//左边的指针(注意,这里的指针是单纯意义上的指针,不是数据结构里边那个指针)
int j = right;//右边指针
while (i < j)//当左右指针还没有相遇的时候
{
while (i < j)//先从后面开始往前与前边的指针比较。
{
if (array[j] <x)
{//如果遇到array[j]<x,把array[j]指向的数往array[i]这个坑里边填
array[i] = array[j];
break;//填完前边的坑后,后边array[j]的位置就有坑了,现在跳出此循环
}
else
{//没有比前边小,此时指针j往前移动指向下一个元素
j--;
}
}
while (i < j)//现在开始从前边往后边进行比较
{
if (array[i] >x)
{//如果遇到前边的array[i]的数比x大的情况,就把array[i]指向的数往array[j]这个坑里边填
array[j] = array[i];
break;// 填完前边的坑后,前边array[i]的位置就又有坑了,现在跳出此循环
}
else
{
i++;//否则i往前走,就这样,i和j彼此逐渐靠近
}
}
}
array[i] = x;//既然跳出最大的这个大循环了,说明i与j相遇了,此时这个共同的坑就是基准x应该要放入的地方
QuickSort(array, left, i - 1);//对数组的前半部分按照这个方法进行排序
QuickSort(array, i + 1, right);//对数组的后半部分按照这个方法进行排序,如此递归调用反复,最终能完成整个数组的排序
}
}
static void Main(string[] args)
{
int[] array = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
QuickSort(array,0,array.Length-1);
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i] + " ");
}
Console.ReadKey();
}
``
以下是我的笔记,有详细的过程可以参考


1989

被折叠的 条评论
为什么被折叠?



