快速排序的基本思想:
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
步骤为:
1、从数列中挑出一个元素,称为 "基准"(pivot),
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O(n log n) |
平均时间复杂度 | O(n log n) |
C#代码如下:
public class QuickSort
{
private int Func(int[] n, int left, int right)
{
int baseNum = n[left]; // 基准数据
int i = left;
int j = right;
while (true)
{
if (n[i] < baseNum && i < j)
{
i++;
}
else if (n[i] > baseNum && i < j)
{
int number = n[i];
n[i] = n[j];
n[j] = number;
j--;
}
else if (n[j] < baseNum && i < j)
{
int number = n[i];
n[i] = n[j];
n[j] = number;
i++;
}
else if (n[j] > baseNum && i < j)
{
j--;
}
else if (i == j)
{
n[i] = baseNum;
break;
}
}
return i;
}
public int[] QuickSortFunc(int[] n, int left, int right)
{
//左下标一定小于右下标,否则就超越了
if (left < right)
{
//对数组进行分割,取出下次分割的基准标号
int i = Func(n, left, right);
//对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSortFunc(n, left, i - 1);
//对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSortFunc(n, i + 1, right);
}
return n;
}
}