- 快速排序
概念:对一个带排序的序列,选择一个基数,一般为序列左侧第一个元素。将所有小于基数的元素,放到基数左边。将所有大于基数的元素,放到基数右边。完成后,基数位置确定(归位)。然后分别对基数左侧、右侧,执行相同的操作。重复上述过程,直到所有元素位置确定。
对于序列 3 2 1 5 4
- 基数3,先从右侧(Right)查找第一个小于基数3的元素,找到1.
- 接着,从左侧(left)查找,第一个大于基数3的元素。遇到Right时停止查找,将基数与left指向的元素对换。基数3归位。
- 此时序列为 1 2 3 5 4 ,分别对 1 2 和 5 4 序列执行上述操作。
- 1 2 序列,基数1,先从Right查找第一个小于1的基数,遇到左侧停止。
- 1 2 序列,接着从左侧查找第一个大于1的基数,遇到右侧停止。
- 基数,与left指向元素对换。基数1归位。
- 对于序列2,因为只有一个元素,因此归位。
- 序列 5 4,操作同上。
- 最后排序为 1 2 3 4 5 .
平均时间复杂度O(NlogN) ,最差时间复杂度O(N^2)
代码
#include <iostream>
#include <stdlib.h>
#include <time.h>
int a[10000];
void quickSort(int lef , int right);
int main()
{
int i = 0;
int j = 0;
int count = 0;
a[0] = 0;
std::cin >> count;
for (i = 1; i <= count; i++) {
a[i] = rand();
}
clock_t start = clock();
quickSort(1, count);
clock_t end = clock();
for (i = 1; i <= count; i++) {
std::cout << a[i] << std::endl;
}
std::cout << "time: "<< (end- start) << std::endl;
return 0;
}
void quickSort(int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = a[left];
i = left;
j = right;
while (i != j) {
while (a[j] >= temp && i < j) {
j--;
}
while (a[i] <= temp && i < j) {
i++;
}
if ( i < j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quickSort(left, i-1);
quickSort(i+1, right);
}