码迷,mamicode.com
首页 > 编程语言 > 详细

算法----(4)快速排序

时间:2018-07-25 22:07:44      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:快速排序   指针   inf   ali   info   个数   分享   auth   i++   

 

快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:

 

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

 

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

 

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

 

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

 

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

 

 

技术分享图片

 1 def partion(nums, left, right):
 2     key = nums[left]
 3     while left < right:
 4         # right下标位置开始,向左边遍历,查找不大于基准数的元素
 5         while left < right and nums[right] >= key:
 6             right -= 1
 7         if left < right:  # 找到小于准基数key的元素,然后交换nums[left],nums[right]
 8             nums[left], nums[right] = nums[right], nums[left]
 9         else:   # left〉=right 跳出循环
10             break
11         # left下标位置开始,向右边遍历,查找不小于基准数的元素
12         while left < right and nums[left] < key:
13             left += 1
14         if left < right:  # 找到比基准数大的元素,然后交换nums[left],nums[right]
15             nums[right],nums[left] = nums[left],nums[right]
16         else:  # left〉=right 跳出循环
17             break
18     return left  #此时left==right 所以返回right也是可以的
19 
20 #realize from book "data struct" of author 严蔚敏
21 def quick_sort_standord(nums, left, right):
22     if left < right:
23         key_index = partion(nums, left, right)
24         quick_sort_standord(nums, left, key_index)
25         quick_sort_standord(nums, key_index+1, right)
26 
27 
28 if __name__ == __main__:
29     nums = [5, 6, 4, 2, 3, 1]
30     print(nums)
31     quick_sort_standord(nums, 0, len(nums)-1)
32     print(nums)

 

算法----(4)快速排序

标签:快速排序   指针   inf   ali   info   个数   分享   auth   i++   

原文地址:https://www.cnblogs.com/MC-Curry/p/9368375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!