算法分析之快速排序

[size=medium]一.快速排序基本特性[/size]


[size=small]平均时间复杂度:O(n*lgn)
最坏时间复杂度:O(n^2)
空间复杂度:O(n*lgn)
不稳定[/size]


[size=medium]二.快速排序描诉[/size]
[size=small]
快速排序是基于分治思想的一种排序算法。
对于一个典型的数组A[n]的排序思路是:

1.分解
把数组分为A[0~k-1]和A[k+1~n]使得前一半数据小于A[K],后一半数据大于A[K]

2.递归
递归调用快速排序对两半数组进行快速排序。

3.合并

如果只说分治思想不好理解,我们还可以说是一种挖坑+分治的思想。在排序过程中不断挖坑
,然后填补!

例子:
原始数据:{2,8,7,1,3,5,6,4}

第一步以数组第一个元素为分割点,在此处为:2
i游标从前往后走找比标准值大的,j游标从后往前走找比标准值小的

找比2小的数据,用j游标从后往前找,直到j指向1时,找到符合条件的数据。

OK!我们挖坑,把2挖掉,用1填坑,自然1所在的位置被挖坑。

现在数据变成了{ 1,8,7, ,3,5,6,4}
i=0;j=3

第二步
改用i游标从前往后找比2大的数,知道i指向8 OK!
把8填到刚挖的坑上。
现在数据变成了{1, ,7,8,3,5,6,4}
i=1;j=3

由于i<j继续
继续用J游标从后往前找比2小的数,直到j=i时。
完成了一趟快速排序。

把2填回。
数据变为:{1,2,7,8,3,5,6,4}

OK我们完成了一趟快速排序。

这是网上找的一个这个版本的快速排序:
思想是一样的
/**************************************************/
/* 函数功能:快速排序算法 */
/* 函数参数:结构类型table的指针变量tab */
/* 整型变量left和right左右边界的下标 */
/* 函数返回值:空 */
/* 文件名:quicsort.c 函数名:quicksort () */
/**************************************************/
void quicksort(table *tab,int left,int right)
{
int i,j;
if(left<right)
{
i=left;j=right;
tab->r[0]=tab->r[i]; //准备以本次最左边的元素值为标准进行划分,先保存其值
do
{
while(tab->r[j].key>tab->r[0].key&&i<j)
j--; //从右向左找第1个小于标准值的位置j
if(i<j) //找到了,位置为j
{
tab->r[i].key=tab->r[j].key;i++;
} //将第j个元素置于左端并重置i
while(tab->r[i].key<tab->r[0].key&&i<j)
i++; //从左向右找第1个大于标准值的位置i
if(i<j) //找到了,位置为i
{
tab->r[j].key=tab->r[i].key;j--;
} //将第i个元素置于右端并重置j
}while(i!=j);

tab->r[i]=tab->r[0]; //将标准值放入它的最终位置,本次划分结束
quicksort(tab,left,i-1); //对标准值左半部递归调用本函数
quicksort(tab,i+1,right); //对标准值右半部递归调用本函数
}
}





[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值