您的位置:首页 > 其它

快速排序

2012-07-25 16:48 169 查看
         昨天做一个欧拉项目(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.快速排序:是就平均时间而言,目前被认为最好的一种内部排序方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: