1.快速排序原理
对于要排序的数组,首先任意选取一个数据(通常为首元素)作为关键数据,将序列中所有比该元素小的元素都放到它的左边,将所有比它大的元素都放到它的右边,再对左右两边分别用同样的方法直到每一个待处理的序列长度为1,排序结束。
2.算法性能分析
(1)时间复杂度
a.最好情况的时间复杂度:每次划分所选择的关键数据均为所在序列的中位数,则经过logn趟划分即可得到长度为1的子序列,此时的时间复杂度为
O
(
n
l
o
g
2
n
)
O(nlog_2n)
O(nlog2n)
b.最坏情况的时间复杂度:每次划分所选择的关键数据均为所在序列的最大或最小,则需要经过n趟划分才能得到长度为1的子序列,此时的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
平均时间复杂度为
O
(
n
l
o
g
2
n
)
O(nlog_2n)
O(nlog2n)
(2)算法稳定性
若一个序列为(3(1),8,2,9,1,3(2)),则经过第一趟(3(2),1,2,3(1),9,8),此时两个相同数的相对位置就发生了变化,因此快速排序算法是一种不稳定的排序算法。
3.图解分析
原始序列为[3,5,8,2,9,1]
第一趟排序的图解如下:
第一趟排序将该序列分为两个子序列[1,2]和[8,9,5],接着按相同的方法将两个子序列进行排序;
第二趟排序之后的结果为[1,2,3,5,8,9],该序列已经为有序序列,排序结束。
4.C/C++实现
#include<iostream>
using namespace std;
void QuickSort(int a[],int low,int high)
{
if(low>=high) return;//此时已经完成排序,直接返回
int i = low;
int j = high;
int key = a[low];
while(i<j)//实现第一趟排序
{
while(i<j&&key<a[j]) j--;//从右向左找比key小的值
a[i] = a[j];
while(i<j&&key>a[i]) i++;//从左向右找比key大的值
a[j] = a[i];
}
a[i] = key;//将关键数据填入low=high的位置
QuickSort(a,low,i-1);//左边子序列递归排序
QuickSort(a,i+1,high);//右边子序列递归排序
}
int main()
{
int a[] = {3,5,8,2,9,1};
int num = 6;
QuickSort(a,0,num-1);
for(int i = 0;i<num;i++)
cout<<a[i]<<" ";//输出1 2 3 5 8 9
return 0;
}
运算结果为: