快速排序
思路
- 选出最左边或者最右边的位置作为这一轮的key值
- 定义最左边的begin和最右边的end,在begin<=end的前提下,end从右往左走直到遇到数比key值小,begin从左往右走直到遇到数比key值大(若选择最左边作为key则需要end先走,若选择最右边作为key则需要begin先走)
- 交换begin和end位置上的值,再次按照步骤2中规则走下去直到begin和end相遇,这个时候将key值与相遇点的值交换,这个时候相遇点左边的值都比key小,右边都比key大
- 将相遇点左边和右边的子序列按照前面的规则再继续执行直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序
代码实现
void QuickSock(int* arr, int begin, int end)
{
if (begin >= end)return;
int left = begin;
int right = end;
int keyi = begin;
while (begin < end)
{
while (arr[end] >= arr[keyi] && begin < end)
{
--end;
}
while (arr[begin] <= arr[keyi] && begin < end)
{
++begin;
}
int imp = arr[end];
arr[end] = arr[begin];
arr[begin] = imp;
}
int imp = arr[keyi];
arr[keyi] = arr[end];
arr[end] = imp;
keyi = end;
QuickSock(arr, left, keyi - 1);
QuickSock(arr, keyi + 1, right);
}
时间复杂度分析
在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(n²),平均时间复杂度为O(nlog₂n)