QuickSort是一种原地排序算法,不稳定。最坏情况是O(n2),平均和最好情况是O(nlogn)
http://stackoverflow.com/questions/2955628/bug-in-quicksort-implementation
伪代码
QUICKSORT(A, p, r)
1 if p < r
2 then q <- PARTITION(A, p, r)
3 QUICKSORT(A, p, q-1)
4 QUICKSORT(A, q+1, r)
QUICKSORT(A, 1, length[A])
PARTITION(A, p, r)
1 x = A[r]
2 i <- p-1
3 for j <- p upto r-1
4 if (A[j] <= x)
5 then i< i+1
6 exchange A[i] <-> A[j]
7 exchange A[i+1] <-> A[r]
8 return i+1
/*
* #include <stdio.h>
*
* void swp(int *a, int *b)
* {
* if (a != b) {
* *a = *a^*b;
* *b = *a^*b;
* *a = *a^*b;
* }
* }
*
* int povit(int a[], int p, int r)
* {
* int x = a[r];
* int i = p-1;
* int j;
*
* for (j = p; j < r; j++) {
* if (a[j] >= x) {
* i++;
* swp(&a[j], &a[i]);
* }
* }
* swp(&a[i+1], &a[r]);
*
* printf("i = %d, r = %d\n", i, r);
*
* if (i == r-1) {
* i = (p+r)/2;
* printf("%d\n", i);
* return i;
* }
*
* return i+1;
* }
*
* void quicksort(int a[], int p, int r)
* {
* if (p < r) {
* int q;
* q = povit(a, p, r);
* quicksort(a, p, q-1);
* quicksort(a, q+1, r);
* }
* }
*
* int main(void)
* {
* int i = 0;
* /\*
* * int a[9] = {
* * 0, 2, 8, 7, 1, 3, 5, 6, 4
* * };
* *\/
* int a[13] = {
* 0, 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21
* };
*
* /\*
* * int a[13] = {
* * 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
* * };
* *\/
*
* quicksort(a, 1, 12);
*
* for (i = 1; i < 13; i++) {
* printf("%d ", a[i]);
* }
* // printf("\n");
*
* return 0;
* }
*/
#include <stdio.h>
void swp(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int a[], int p, int q)
{
int i = p, j;
int x = a[p];
for (j = p+1; j <= q; j++) {
if (a[j] <= x) {
i++;
swp(&a[i], &a[j]);
}
}
swp(&a[i], &a[p]);
return i;
}
void quicksort(int a[], int p, int q)
{
int r = partition(a, p, q);
quicksort(a, p, r-1);
quicksort(a, r+1, q);
}
int main(void)
{
int i;
int a[] = {0, 1, 8, 9, 3, 5, 2, 6, 4, 7 ,0};
quicksort(a, 1, 10);
for (i = 1; i <= 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
#include <stdio.h>
void swp(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void qsort(int a[], int p, int r)
{
if (p < r) {
int x = a[p];
int i = p;
int j = r +1;
while (1) {
do {
i++;
} while (i <= r && a[i] < x);
do {
j--;
} while (a[j] > x);
if (i >= j)
break;
swp(&a[i], &a[j]);
}
swp(&a[p], &a[j]);
qsort(a, p, j-1);
qsort(a, j+1, r);
}
}
int main(void)
{
int i;
int a[13] = {
0, 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21
};
qsort(a, 1, 12);
for (i = 1; i < 13; i++) {
printf("%d ", a[i]);
}
return 0;
}