排序算法之快速排序

参考:http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html  《大话数据结构》快速排序

 

快速排序是最经典效率最高的排序算法,其最优时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),最差情况为O(n2).

 

其基本思想是首先确定一个枢纽,然后寻找一个恰当的位置,使得枢纽前的序列均小于枢纽,枢纽后的序列大于枢纽。然后使用分治递归的方法处理枢纽两端的子序列,直至子序列长度为0或1。

 

在此,枢纽的选择是有讲究的,不明智的方法是选择待排序序列的第一个或者最后一个元素作为枢纽,因为这样会在某些情况下(序列进行过预排序或逆序)使算法复杂度大大增加。还有方法就是随机选择枢纽,或者从第一,最后,中间三个元素中选择一个居中的元素,作为枢纽。

 

算法的代码如下:

 

void QSort(SqList *L, int low, int high)

{

int pivot;

if(low < high)

{

pivot = Partition(L, low, high);

QSort(L, low, pivot - 1);

QSort(L, pivot + 1, high);

}

}

 

int Partition(SqList *L, int low, int high)

{

int pivotkey;

pivotkey = L->r[low];

while(low < high)

{

while(low < high && L->r[high] >= pivotkey)

high--;

Swap(L, low, high);

while(low < high && L->r[low] <= pivotkey)

low++;

Swap(L, low, high);

}

return low;

}

 

void Swap(SqList *L, int low, int high)

{

int temp;

temp = L->r[low];

L->r[low] = L->r[high];

L->r[high] = temp;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值