快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-Conquer Method)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
实例源代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
int n;
int *a;
char srcfile[32] = "src.txt";
char dstfile[32] = "dst.txt";
int input(void)
{
FILE *fp;
fp = fopen(srcfile, "r");
fscanf(fp, "%d\n", &n);
a = (int *)malloc(n * sizeof(int));
for(int i = 0; i < n; i++) {
fscanf(fp, "%d ", &a[i]);
//printf("%d ", a[i]);
}
//printf("\n");
return 0;
}
int src(void)
{
FILE *fp;
char str[32];
//printf("src:\n");
fp = fopen(srcfile, "w+");
sprintf(str, "%d\n", n);
fputs(str, fp);
srand((unsigned int)time(NULL));
for(int i = 0; i < n; i++) {
a[i] = rand() % 1000000;
//printf("%d ", a[i]);
sprintf(str, "%d ", a[i]);
fputs(str, fp);
//fwrite(str, strlen(str), 0, fp);
}
//printf("\n");
fclose(fp);
return 0;
}
int dst(void)
{
FILE *fp;
char str[32];
fp = fopen(dstfile, "w+");
sprintf(str, "%d\n", n);
fputs(str, fp);
//printf("dst:\n");
for(int i = 0; i < n; i++) {
//printf("%d ", a[i]);
sprintf(str, "%d ", a[i]);
fputs(str, fp);
}
//printf("\n");
fclose(fp);
return 0;
}
int SelectPivot(int A[], int L, int H)
{
int pivot;
pivot = L + rand() % (H - L + 1);
return pivot;
}
int Partion(int A[], int L, int H)
{
int i, j, index, pivot;
index = L + rand() % (H - L + 1);
pivot = A[index];
i = L - 1;
j = H + 1;
while(1) {
//for(int k = L; k <= H; k++)
//printf("%d ", A[k]);
//printf("\n");
while(A[++i] < pivot);
if(i < j) {
A[index] = A[i];
index = i;
}
while(A[--j] > pivot);
if(i < j) {
A[index] = A[j];
index = j;
}
//printf("%d %d\n", i, j);
if(i > j)
break;
//printf("%d %d\n", i, j);
}
A[index] = pivot;
return index;
}
void QuickSort(int A[], int L, int H)
{
int index;
if(L >= H)
return;
index = Partion(A, L, H);
QuickSort(A, L, index - 1);
QuickSort(A, index + 1, H);
}
void sort(int A[], int N)
{
QuickSort(A, 0, N - 1);
}
int main(int argc, char **argv)
{
n = 100000;
a = (int *)malloc(n * sizeof(int));
srand((unsigned)time(NULL));
src();
//strcpy(srcfile, argv[1]);
//strcpy(dstfile, argv[2]);
//input();
sort(a, n);
dst();
free(a);
return 0;
}