您的位置:首页 > 其它

算法学习与实践之快速排序

2013-06-24 09:36 190 查看
快速排序是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: