- 思想
分治 ( 递归 )
设立 "基准" pivot(一般为待排序列的第一个元素),根据 "基准" 拆出两个集合,左侧小,右侧大,每个集合再设立 “基准” 继续拆分,直到全部拆完顺序为止
- 算法图解
待排数组:array[]{4, 2, 9, 11, 7, 8, 6, 5, 3, 10 }
- 应用场景
1 快速排序就是一个“快”字,排序算法中平均排序速度很好的排序算法,在空间允许的情况下可以使用
2 大文件处理时,结合堆排序或者归并,分解小文件并在内存中进行快排
- 算法优化(以不大幅度增加代码复杂度为原则)
1 多线程快速排序:在多核 CPU 的今天,可以利用多核计算快速排序,拆分的每个集合都可以使用一个线程处理并返回一个值
2 减少交换次数
- 时间复杂度(不稳定)
最差 O(n^2)
最优 O(nlog2n)
平均 O(nlog2n)
- 空间复杂度
根据实现的方式不同而不同 O(log2n)~O(n)
- 程序实现 (本例使用了C#)
#region 方式一
public static int SortUnit(int[] array, int low, int high)
{
int key = array[low];
Console.WriteLine("key : " + key);
Console.WriteLine("");
while (low < high)
{
while (array[high] >= key && high > low)
{
--high;
}
array[low] = array[high];
while (array[low] <= key && low < high)
{
++low;
}
array[high] = array[low];
}
array[low] = key;
Console.WriteLine(string.Join(",", array));
//Console.WriteLine("");
return high;
}
public static void Sort(int[] array, int low, int high)
{
if (low >= high)
return;
/*完成一次单元排序*/
int index = SortUnit(array, low, high);
/*对左边单元进行排序*/
Sort(array, low, index - 1);
//Console.WriteLine("左侧排完:" + string.Join(",", array));
/*对右边单元进行排序*/
Sort(array, index + 1, high);
//Console.WriteLine("右侧排完:" + string.Join(",", array));
}
#endregion