快速排序


         昨天做一个欧拉项目(projecteuler.net)的题目。需要用到快速排序。所以自己又研究了一下。下面作一个总结吧,内容源自严蔚敏的数据结构课本。

1.快速排序的基本思想:

       通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.快速排序的描述:

    一趟快速排序的具体做法:(需要任意选择一个记录作为枢轴,经过一趟快速排序后所有比枢轴记录大的记录都在枢轴的右边,所有比枢轴记录小的记录在枢轴记录的左边。)首先附设两个指针low和high,设枢轴记录关键字为pivotkey,则先从high所指位置起,向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey 的记录和枢轴记录互换。重复这个过程直至low=high为止。

3.程序示例:

      下面的程序是将name数组进行快速排序,代码如下:

#include <stdio.h> 
#include <string.h> 

char *name[] = {
	"LJN",
	"CHJ",
	"HUNTER",
	"DREAM",
	"HUNTINUX",
	"FOOL"
};

int partition(char *name[], int low, int high);//一趟快速排序
void qsort(char *name[], int low, int high);//快速排序
void printarr(char *name[], int n);//打印数组

int main()
{
	printarr(name, 6);
	qsort(name, 0, 5);
	putchar('\n');
	printarr(name, 6);
	return 0;
}

int partition(char *name[], int low, int high)
{//一趟快速排序
	char *pivotkey = name[low];

	while(low < high){
		while(low < high && strcmp(pivotkey, name[high]) <= 0)
			high --;
		name[low] = name[high];
		while(low < high && strcmp(pivotkey, name[low]) >= 0)
			low ++;
		name[high] = name[low];
	}

	name[low] = pivotkey;
	return low;
}
void qsort(char *name[], int low, int high)
{//快速排序
	int pivotloc;

	if(low < high){
		pivotloc = partition(name, low, high);
		qsort(name, low, pivotloc - 1);
		qsort(name, pivotloc + 1, high);
	}
}

void printarr(char *name[], int n)
{//打印数组
	for(int i = 0; i < n; i++){
		printf("%s\n",name[i]);
	}
}


 

4.快速排序:是就平均时间而言,目前被认为最好的一种内部排序方法。

你可能感兴趣的:(快速排序)