刨了快速排序
Posted 陈老爷爷的烟斗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刨了快速排序相关的知识,希望对你有一定的参考价值。
摘要:这篇文章概括的描述了常见排序法,然后对快速排序的思想以及代码实现进行了详细的解剖,最后推出一道排序的面试题
最近一直在鼓捣排序,今天撸一篇排序吧。
排序中比较常见的种类有:冒泡法排序;选择排序;插入排序,快速排序,归并排序
其中最常用到就是快速排序:
其主要思想:1.找一个标杆(或者你可以称之为标准)元素(通常默认选择序列中的第一个元素);
2. 遍历所有的元素和标杆进行比较,最后大于标杆的放在其右,小于标杆的放在其左边;
3.然后重复1和2 以此来达到排序目的
一趟快速排序:alist 是待排序的列表
1.标杆元素 mid = alist[0]
2 取两个游标(变量)low 和 high
low 指向 alist[0],low =alist[0]
high指向alist[len(alist)-1],high = alist[len(alist)-1]
比较high指向位置的值和mid的大小,如果alist[high] < mid 把alist[high] 赋值给alist[low],否则 high向后退1,即 high -= 1;
然后low指向的位置向前移动1,即 low += 1,继续比较此时alist[low] 和 mid 的大小
如果alist[low] > mid ,把alist[low]赋值给alist[high],然后high向后退1,否则low向前移动1
3 直到low == high ,第一趟快排结束
真代码实现!
1 def quick_sort(alist,start,end): 2 if start >= end: 3 return 4 mid = alist[start] #标杆元素 5 low = start #指向第一个元素的游标 6 high = end #指向最后一个元素的游标 7 while low < high: 8 #两个游标没有相遇执行此循环 9 while low< high and alist[high]>= mid: 10 #high指向的元素大于mid标杆元素high向后退1 11 high -= 1 12 #把小于标杆元素的值赋给low指向的位置 13 alist[low] = alist[high] 14 15 while low < high and alist[low] < mid: 16 #low指向的元素小于 mid标杆元素 low向前进1 17 low += 1 18 #把大于标杆元素的值赋给high指向的位置 19 alist[high] = alist[low] 20 #low和high相遇跳出循环,并且把mid赋值给low指向的位置 21 alist[low] = mid 22 23 #把小于mid的序列重复进行以上操作 24 quick_sort(alist,start,low) 25 #把大于mid 的序列重复以上操作 26 quick_sort(alist,low+1,end) 27 28 29 if __name__ == ‘__main__‘: 30 alist = [1,5,3,44] 31 quick_sort(alist,0,len(alist)-1) 32 print(alist) 33 34
面了个试:有两个序列a和b,大小都为n,
要求:交换a和b中的元素,使得a序列中的和 与b序列中的和之差最小。
思路:合并两个列表并排序,然后分别向两个空列表中追加元素,奇数位置的元素追加到列表1,偶数位置的追加到列表2
法1:合并之后排列用内建函数sort排列完成后追加元素
1 def split_(alist): 2 list1 = [] 3 list2 = [] 4 n = len(alist) 5 for i in range(n): 6 if i%2 ==0: 7 list2.append(alist[i]) 8 else: 9 list1.append(alist[i]) 10 11 print(‘第一个列表:%s,第二个列表: %s‘%(str(list1),str(list2))) 12 return ‘两个列表差为:%d‘% abs(sum(list1) - sum(list2)) 13 14 if __name__ == ‘__main__‘: 15 16 a= [220,343,44,3,34,46,55,1004] 17 b = [100,22,333,465,544,66,77,483] 18 a.extend(b) 19 a.sort() 20 print(split_(a))
上述的输出为:
第一个列表:[22, 44, 55, 77, 220, 343, 483, 1004],第二个列表: [3, 34, 46, 66, 100, 333, 465, 544]
两个列表差为:657
可能这个例子解法和快排没多大关系,但是如果限制内建函数的使用,那么我们可以先用快排,再取元素追加
以上是关于刨了快速排序的主要内容,如果未能解决你的问题,请参考以下文章