您的位置:首页 > 其它

【算法-排序之二】快速排序

2016-03-09 00:00 330 查看

算法-排序之快速排序

快速排序得名于实际应用的高效率,它几乎是最快的排序算法,入选20世纪十大算法之列。快速排序体现了计算机设计的“分治法”思想,核心是将整个问题分割成多块相对容易处理的小问题,分而治之。利用分治法原理的排序算法,还有希尔排序算法等等。

1.快速排序QuickSort

核心:如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置。

快速排序是做到着一定的步骤分为:

1.选取分界数,参考这个分界数,大于参考数放在右边,小于的放在左边。

2.对左右两边的序列分别递归进行1处理

3.将整个序列合并得到有序结果

相比冒泡排序【算法-排序之一】冒泡排序”冒泡“的形象,快速排序似乎就不那么贴切了。分析上述步骤,该算法每次分区,实际上确定了所选分界数的位置。





选中分界数:8 然后将序列分割






比8小的数 比8大的数

根据左右两个框内的数字个数,可以知道分界数8应该摆放的位置。快速排序的实现方式有很多,下面给出一种实现:










快速排序是众多排序算法中较复杂的一种,只要认真抓住算法的核心,理解快速排序还是不难的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
//分区函数Part()

//start,end分别为数据起始与结束位

int
Part
(
int
Array
[],
int
left
,
int
right
){

int
temp
=
Array
[
left
];
//选择最第一个数据为分界数,并保存

while
(
left
<
right
)

{

while
(
left
<
right
&&
Array
[
right
]
>
temp
){

right
--
;

}

Array
[
left
]
=
Array
[
right
];
//找到比分界数小的数,放到数组的左边

//此时,right右边的数均比分界数大

while
(
left
<
right
&&
Array
[
left
]
<=
temp
){

left
++
;

}

Array
[
right
]
=
Array
[
left
];
//找到比分界数大的数,放到right位置

//此时left左边的数均比分界数小

}
//当left与right相等时,便找到了分界数的位置

Array
[
left
]
=
temp
;

return
left
;

}

//快排QuickSort()

void
QuickSort
(
int
Array
[],
int
left
,
int
right
){

if
(
left
<
right
)
//控制分区是否结束

{

int
p
=
Part
(
Array
,
left
,
right
);

QuickSort
(
Array
,
left
,
p
-
1
);
//左边递归

QuickSort
(
Array
,
p
+
1
,
right
);
//右边递归

}

}

来自CODE的代码片

QuickSort.c


2.时间复杂度

分析快速排序的时间复杂度比较困难,通过递归方法,可以初略地看到结果:
数据个数n=1是,F=0

F(n)=n-1+2F(n/2) //分成两个大小为n/2的快

=n-1+2(n/2-1)

....

=O(nlogn)

这个时间复杂度优于冒泡排序【算法-排序之一】冒泡排序

3. 空间复杂度

快速排序的空间消耗主要来源于递归调用时产生的栈消耗,其复杂度介于O(logn)与O(n)之间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: