一 、快速排序的思路:
1 从源数组里面选择一个数 v 作为对比
2 i 从左边开始遍历,直到找到一个比 v 大的数
3 j 从右边开始遍历,直到找到一个比 v 小的数,或者遍历到最左边跳出循环
4 交换两个位置 i 和 j 的数,回到步骤2
5 交换 位置 i 和 v 的数
二、代码:
#include <stdio.h>
void swap(int * a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int a[], int l, int r)
{
int i = l - 1, j = r, v = a[r];
for (;;)
{
while (a[++i] < v);
while (a[--j] > v) if (j == l) break;
if (i >= j) break;
swap(&a[i], &a[j]);
}
swap(&a[i], &a[r]);
return i;
}
void quik_sort(int a[], int l, int r)
{
if (l >= r) return;
int i = partition(a, l, r);
quik_sort(a, l, i - 1);
quik_sort(a, i + 1, r);
}
int main()
{
int arr[] = { 8,36,23,2,17,6 };
int N = sizeof(arr) / sizeof(int), i = 0;
for (i = 0; i < N; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
quik_sort(arr, 0, N - 1);
for (i = 0; i < N; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
三、程序执行流程:
执行流程图
箭头方向是程序流顺序,从位置上看,垂直同一列中的调用属于同一个函数内的调用。
快速排序的复杂度:
时间复杂度:
- 平均情况:O(nlogn)
- 最好情况:O(nlogn)
- 最坏情况:O(n²)
空间复杂度:
- 辅助空间:O(nlogn)
稳定性:不稳定
稳定性的意思是,对于一组输入,相同值的元素的位置,排序前后有变化则是不稳定,没变化即是稳定。
比如个数组a:2,12,9,9,11
快速排序过程:
1> 左边找到12 比 11大,右边找到9比11小,交换9和12
2> 11和12 交换,完成。
注意观察,原来 a[3]位置的9最终到了 a[1], a[2]位置的9还是a[2],这样原来的相对位置就改变了,这种情况下就说它不稳定。
这个是递归形式的写法,还有非递归形式的。
*注: 个人笔记只用,如果不妥,还望不吝赐教。