快速排序算法是一种分治排序算法。它将数组划分为两个部分,然后分别对两个部分进行排序。通过一次排序,算法将达到如下目的:
1. 对于某个 i ,a [i] 在数组的最终位置上。所谓最终位置,即该数组经过完全排序后各个元素的位置。
2. a [1],….,a[i-1] 中的元素都比 a[i] 小。
3.a[i+1],….,a[r] 中的元素都比 a [i] 大。r是最后一个序号。
快速排序是一个递归划分过程。我们对一个文件进行划分,划分的原则是将一些元素(划分元素)放在它们最终应该在的位置上。比划分元素小的元素都在划分元素的左边,比划分元素大得元素都在划分元素的右边。然后分别对左右两部分分别递归处理。
选定a [0] 作为划分元素 。然后首先从左到右寻找比 a[0] 大的元素,找到后停止。接着从右到左寻找比 a[0] 小的元素 , 找到后停止。将这两个元素交换。这样小的元素被排到了 a[0] 的左边,大的元素被排到了右边。继续刚才的旅途,不断的左右交换。最后划分元素a [i] 也做了交换,放到了它的最终位置上。
对于数组 A [7,9,0,1,3,1,5] 其过程如下:
第一次排序
将A[0]=7设为划分元素。
1. 由于是将 A[0] 设为划分元素,所以右游标先移动。右游标停留在 A[6]=5 上,因为 5 小于 7 。将 A[0] 与 A[6] 交换 .
2. 然后移动左游标,游标停留在 A[1]=9 上,因为 9 大于 7 。将 A[1] 与 A[6] 交换。
3. 移动右游标,游标停留在 A[5]=1 上,将 A[1] 与 A[5] 交换
4. 移动做游标一直移动到 A[5]=7, 此时左游标和右游标相会,此次排序结束。划分元素 7 ,处于最终位置。
第一次排序的结果将数组分为两个部分。第一部分是 A[0]~A[4], 由小于7的元素组成 , 第二部分为 A[6], 由大于 7 的元素组成。接下来的操作是将第一次排序的步骤在这些分组中重新再来一遍。首先是A [0]~A[4] 部分。
第二次排序
将 A[0]=5 设为划分元素。
1. 同样的从右游标开始。右游标定位到 A[4]=3 ,因为 3 小于划分元素 5 。将A [0] 与 A[4] 交换。
2. 开始移动左游标,一直到 A[4]=5 。此时左游标和右游标相会,此次排序结束。划分元素 5 处于最终位置。
接下来的排序就是不断的递归了,直到每个元素都处于最终位置为止。
第三次排序
第四次排序
第五次排序
第六次排序
当左边的部分都递归结束后,开始递归右边部分。
第七次排序
结果
在以上的例子中划分元素的位置其实很重要。以最左端作为划分元素,游标就应该从右边先移动;以最右端作为划分元素,游标就应该从左边先开始。这是为了解决顺序数组的问题。一个数组如 [1,2,3,4,5] ,划分元素为最左边,且左游标先移动,那么第一次排序的后果就会是 [5,2,3,4,1] 。这是一个错误的结果,将使排序永远进行下去。
python代码实现:
#!/usr/bin/env python
def swap(array,i,j):
temp = array[i]
array[i]=array[j]
array[j]=temp
def parition(arry,begin,end):
temp = array[begin]
while 1:
while begin<end:
if(array[end]<temp):
swap(array,begin,end)
break
else:
end -=1
while begin<end:
if(array[begin]>temp):
swap(array,begin,end)
break
else:
begin += 1
if(begin == end):
break
print array
return begin
def quickSort(array,begin,end):
i=parition(array,begin,end)
if begin<i-1:
print '------------right'
quickSort(array,begin,i-1)
if i+1<end:
print '------------left'
quickSort(array,i+1,end)
if __name__=="__main__":
array=[7,9,0,1,3,1,5]
quickSort(array,0,len(array)-1)
print array
参考文档:
http://my.oschina.net/997155658/blog/311407
《算法:C语言实现》