排序算法之快速排序

快速排序的基本思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

例如:待排序列为4,7,5,3,6,1,8,2

定义两个变量low,high,初始分别指向第一个和最后一个数字

第一趟排序过程如下:

1、选择一个基准数字(可以为序列中任意数字),这里选择第一个数字key=4;

2、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,7,5,3,6,1,8,4 此时low指向2,high指向4;

3、从左向右遍历序列(low++),直到low指向的值大于key,交换2,4,5,3,6,1,8,7 此时low指向4,high指向7;

4、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,1,5,3,6,4,8,7 此时low指向1,high指向4;

5、从左向右遍历序列(low++),直到low指向的值大于key,交换2,1,4,3,6,5,8,7 此时low指向4,high指向5;

6、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,1,3,4,6,5,8,7 此时low指向3,high指向4;

7、low+1=high,结束第一趟遍历,此时4所在位置即为排序后的最终位置;

然后分别对(2,1,3)和(6,5,8,7)进行快速排序。

关键代码如下:

int Partition(int a[], int low, int high)
{
int key = a[low];
while (low < high)
{
while (key<=a[high]&&low<high)
{
high--;
}
a[low] = a[high];
while (key >= a[low]&&low<high)
low++;
a[high] = a[low];
}
a[low] = key;
return low;
}
void QuickSort(int a[], int low, int high)
{
if (low < high)
{
int index = Partition(a, low, high);
QuickSort(a, low, index - 1);
QuickSort(a, index + 1, high);
}
}

分析:时间复杂度

最坏时间复杂度:对于带排序的n个元素,每次的划分结果中个数分别为1和n-1,此时时间复杂度为O(n2)

最好时间复杂度:每次划分均为平均划分,此时时间复杂度为O(nlogn)

平均时间复杂度:O(nlogn)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值