快速排序法的总结

快速排序法的总结

今天终于从《征服c指针》这本书看到了早有耳闻的快速排序法,以前学过选择排序,交换排序,冒泡排序,今天又多了一种排序算法。书中作者讲到测试对5万个随机整数进行排序,冒泡排序花了117秒,而快速排序仅仅用了65毫秒。哎,果真算法正重要啊!

一开始看《征服c指针》的快速排序的交换法感觉没怎么看懂,于是上网找了篇好文“原文地址http://blog.csdn.net/morewindows/article/details/6684558”的白话经典算法系列,其中介绍的填坑式快速排序倒是很容易懂,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<stdio.h>
#include<stdlib.h>
void quicksort(int s[] ,int left,int right)//快速排序算法
{
if(left<right)
{
int key=s[left];//关键值设为左边第一个数
int i=left,j=right;
while(i<j)
{
while(i<j&&s[j]>key)//从右开始寻找比key小的值
{
j--;
}
if(i<j)
{
s[i]=s[j];//将s[j]的值赋给s[i],此时s[j]为一个坑
i++;
}
while(i<j&&s[i]<key)//从左往右寻找比key大的值
{
i++;
}
if(i<j)
{
s[j]=s[i];//将s[i]的值赋给s[j],将s[j]之前玩的坑填上
}
}

//如果i=j,这轮分堆分完,将key填给s[i]
s[i]=key;
//递归
quicksort(s,left,i-1);
quicksort(s,i+1,right);
}
}

int main()
{
int i;
int s[]={1,4,5,6,3,2,9};
quicksort(s,0,6);//数组长度记得减1
for (i=0;i<sizeof(s)/sizeof(int);i++)
{
printf("%d\t",s[i]);
}
return 0;
}

下面这个算法是《征服c指针》给出的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<stdlib.h>
#define SWAP(a,b) {int temp;temp=a;a=b;b=temp;}
void quicksort2(int *s,int left,int right)
{
int l=left,r=right;
int key=(s[l]+s[r])/2;
while(l<=r)
{
for(;s[l]<key;l++)//从左寻找
;
for(;s[r]>key;r--)//从右寻找
;
if(l<=r)
{
SWAP(s[l],s[r]);
l++;
r--;//这个操作是进行下一轮交换的预备
}
}
//从循环出来后说明一轮分堆已完成
if(r>left)//递归左堆
{
quicksort2(s,left,r);
}
if(l<right)//递归右堆
{
quicksort2(s,l,right);
}
//不满足条件即退出
}
int main()
{
int i;
int s[]={1,4,5,6,3,2,9};
quicksort2(s,0,6);//数组长度记得减1
for (i=0;i<sizeof(s)/sizeof(int);i++)
{
printf("%d\t",s[i]);
}
return 0;
}

我觉得目前其实都还没完全掌握快速排序,主要是还没实战过,代码写少了,既然这种排序算法更优,那么以后多用这种算法来排序。