1、快速排序
算法步骤:
- 从数列中挑出一个元素,称为 “基准”(pivot)。
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
2、算法实现
/*
快速排序算法:
通俗的描述法:
将一个待排序列,取一个基准值,划分成左右2部分,左边的都比基准值小,
右边的都比基准值大;基准值一般取待排序列的第一个元素,具体操作如下面的算法,
low-high用来指定这个即将被分割的序列的范围,通常把第一个元素取出来,保存在临时
变量,当做基准值,这时候可以把low位置看作一个空位置,
因为它的元素保存在基准变量里了,然后扫描从low到high的所有元素,先从high处开始,
如果元素比基准值大,则high--,如果小于基准值,则交换high处元素到low处(此时low处
为空),交换后,保持high不变,high位置变为空,接着换从low处开始扫描,遇到比基准
值小的,low++,如果大于了基准值,那么又交换low和high处的元素,交换后low位置又处
于空!如此循环,直到low不在小于high,这样排序后,基准值就排到了一个正确的位置,
左边的都比基准值小,右边的都比基准值大;然后返回这个位置号,下一次分割就依据这个
位置号,把序列分割成两部分,依次类推!
*/
int partition(int *array,int low, int high)
{
int temp = array[low];
while(low < high)
{
while( (low < high) && (array[high] >= temp))
{
high--;
}
swap(array,low,high);
while((low < high) &&(array[low] <= temp))
{
low++;
}
swap(array,low,high);
}
return low;
}
/*
递归分割:
第一次分割时,low=0;,high=len-1;把第0个元素作为基准值,对序列进行排序,排序后
该基准值,会被移动到正确的位置,low会记录这个位置,并返回这个位置号
第二次分割:上一次分割后,序列被分成了两部分,第一部分:low=0,high=lastlow - 1;
第二部分:low=lastlow +1,high=len-1,然后再对它们分别进行取基准值,再分割
第三次分割:类似于第二次,直到条件不满足,递归退出!
*/
void QSort(int *array, int low,int high)
{
if(low < high)
{
int lastlow = partition(array,low,high);
QSort(array,low,lastlow - 1);
QSort(array,lastlow + 1, high);
}
}
void QuickSort(int *array, int len)
{
QSort(array,0,len - 1);
}
3、完整源码下载
文件名:quicksort-1.0.tar.gz
链接: http://pan.baidu.com/s/1pJLvi91 密码: ahss
编译步骤:
0.1 解压缩:tar -zxvf quicksort-1.0.tar.gz
0.2 编译:gcc -std=c99 -Wall -g quicksort.c -o quicksort
0.3 运行:./quicksort