首页 > 代码库 > 刨了快速排序

刨了快速排序

摘要:这篇文章概括的描述了常见排序法,然后对快速排序的思想以及代码实现进行了详细的解剖,最后推出一道排序的面试题

最近一直在鼓捣排序,今天撸一篇排序吧。

排序中比较常见的种类有:冒泡法排序;选择排序;插入排序,快速排序,归并排序

其中最常用到就是快速排序:

其主要思想: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

可能这个例子解法和快排没多大关系,但是如果限制内建函数的使用,那么我们可以先用快排,再取元素追加

                                        

                  

刨了快速排序