-
思想
分治 ( 递归 )
设立 "基准"
pivot(一般为待排序列的第一个元素),根据 "基准" 拆出两个集合,左侧小,右侧大,每个集合再设立 “基准” 继续拆分,直到全部拆完顺序为止
-
算法图解
待排数组:array[]{4, 2, 9, 11, 7, 8, 6, 5, 3, 10 }
-
应用场景
1 快速排序就是一个“快”字,排序算法中平均排序速度很好的排序算法,在空间允许的情况下可以使用
2 大文件处理时,结合堆排序或者归并,分解小文件并在内存中进行快排
-
算法优化(以不大幅度增加代码复杂度为原则)
1
多线程快速排序:在多核 CPU 的今天,可以利用多核计算快速排序,拆分的每个集合都可以使用一个线程处理并返回一个值
2
减少交换次数
-
时间复杂度(不稳定)
最差
O(n^2)
最优
O(nlog
2
n)
平均
O(nlog
2
n)
-
空间复杂度
根据实现的方式不同而不同
O(log
2
n)~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