昨天做一个欧拉项目(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.快速排序:是就平均时间而言,目前被认为最好的一种内部排序方法。
快速排序
最新推荐文章于 2019-10-17 22:16:10 发布