快速排序:每次寻找一个主元(pivot),将所有比pivot小的元素放在它的左边,将所有比pivot大的元素放在它的右边;再对左右子列进行递归直到子序列长度为1。
1.时间复杂度:O(NLogN),在高级排序中是最快的,但是如果数据量较小时,快排的优势就没有了;因此可以和低级排序结合使用,当数据量小于一个值时,调用初级排序
2.稳定性:不稳定
3.实现方式:递归实现
4.算法实现:快排算法包括三个部分:寻找主元,递归排序,外部调用接口
(1)寻找主元的函数:
void find_pivot(int a[], int left, int right) //取一个序列左中右三个元素的中位数
{
int mid = (left + right) / 2;
if (a[left] > a[mid])
swap(a[left], a[mid]);
if (a[left] > a[right])
swap(a[left], a[right]);
if (a[mid] > a[right])
swap(a[mid], a[right]);
swap(a[mid], a[right]); //将主元放置在序列右端
}
(2)递归排序函数:
void Qsort(int a[],int left,int right)
{
if (right > left)
{
find_pivot(a, left, right);
int i = left, j = right;
while (j > i)
{
while (a[i] < a[right])
++i;
while (a[j] > a[right])
--j;
if (i < j)
swap(a[i++], a[j--]);
}
swap(a[i], a[right]);
Qsort(a, left, i - 1);
Qsort(a, i + 1, right);
}
}
(3)外部调用接口:
void Quick_sort(int a[], int n)
{
Qsort(a, 0, n - 1);
}