重温排序之快速排序(qsort)

来源:互联网 发布:十八岁出门远行 知乎 编辑:程序博客网 时间:2024/05/12 03:37

快速排序算法几乎涵盖了所有经典算法的所有榜单。它曾获选二十世纪最伟大的十大算法

最近温习算法,看到快排之处,不禁热血沸腾,惊叹于它的优雅,它的简洁,遂作如下实现,以作纪念

 

#include<stdio.h>

int a[10]={2,34,5,23,1,455,3,65,0,99};//待排序数组

 

int parition(int *a,int low,int high)//

{

int pivotkey=a[low];//枢纽元素。

while(low<high)

{

while(low<high&&a[high]>=pivotkey) high--;

a[low]=a[high];//此时high指针所指示的数组元素已经没有用

while(low<high&&a[low]<=pivotkey) low++;

a[high]=a[low];//此时hign成替代品

}//脱出循环的标志是low==hign,此时恰好存放pivotkey

a[low]=pivotkey;

return low;//返回已经排好序的数组的下标,表明这个元素已经排好位置

 

}//一趟排序的时间复杂度是o(n)

 

 

//对paition算法的点说明,这里选择待排序的第一个元素作为枢纽,排序的结果是,这个枢纽元素位于

//正确的排序位置上,而在这个位置的左边,任何一个值都小于等于这个枢纽元素,而且右边的元素都

//大于等于这个枢纽元素

 

void qsort(int *a,int low,int high)//递归的深度为lgn

{

if(low>=high) return;

int part=parition(a,low,high);

qsort(a,low,part-1);

qsort(a,part+1,high);

}

//qsort算法有一个明显的缺点当待排序数组已经是排好序的情况下,解决排序问题当产生o(n^2)的时间复杂度

 

 

void main()//整个算法的时间复杂度为n*lgn

{

 

qsort(a,0,9);

for(i=0;i<10;i++)

{

printf("%d  ",a[i]);

}

puts("");

}

 

特别是pairition方法,简直神来之笔!

 

原创粉丝点击