Python與快速排序


這個算法系列主要是自己學習算法過程中動手實踐一下,寫這個文章作為筆記和分享個人心得,如有錯誤請各位提出。

注:轉載請說明出處


 問題提出:

將以下數據升序排列:5, 2, 8, 6, 4, 9, 7, 3, 1


快速排序的原理:

快速排序的核心思想是(如下圖)

1.先確定一個基准數,讓后按照比較規則,如本例是升序排列,則將比基數大的放到右邊,比基數小的放到左邊。

2.接下來各邊重復步驟1,直到全部排序完畢。

 

程序設計的思路就是(以上面的問題為例)

左右分別遍歷比較

1 #非程序代碼,只用來講解
2 
3 a = [5,2,8,6,4,9,7,3,1]   #數據
4 temp              #用於保存基數
5 left              #左起點
6 right             #右起點
7 i                 #左游標
8 j                 #右游標

1.將第一個數作為基數,temp=a[left], 初始化兩個游標 i=left;j=right,(當left大於right時,分類結束)。

2.先由右邊 j 開始遍歷(必須要先從右邊開始遍歷,想想為什么,后面會解答),當遇到比基數小的停下;

   然后左邊 i 開始遍歷,當遇到比基數大的數停下,當i<j時,交換i和j所在的數a[i], a[j] = a[j],a[i],

   交換完成后,繼續遍歷直到 i 和 j 相遇。

3.當i 和 j 相遇,說明一次分類完成,注意此時要將基數和 i,j 相遇時所在的數交換。a[left], a[i]=a[i], a[left]

4.先處理基數左邊的數字,設置左起點為left=left,右起點為right=i-1, 重復1到5步。

5.當左邊的數字處理完成,再處理右邊數字,設置左起點為了left=i+1, 右起點為right=right,重復1到5步。 


 

接下來為python程序源碼:(可以到github上下載https://github.com/DIGCreat/pythonAndAlgorithms.git

 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 '''
 4 簡介:本程序主要是用python實現快速排序,程序的功能是實現
 5      升序排列。
 6      本程序在數據量大的情況下,需要注意遞歸深度的問題。
 7 
 8 作者:King  日期:2016/08/01  版本1
 9 '''
10 
11 class QuickSort(object):
12     '''
13     self.datas:       要排序的數據列表
14     _sort():          排序函數
15     show():           輸出結果函數
16 
17     用法:
18     QuickSort(datas)  實例化一個排序對象
19 
20     QuickSort(datas)._sort(left, right)
21                       開始排序,由於排序直接操作
22                       self.datas, 所以排序結果也
23                       保存在self.datas中, left為
24                       排序的開始位置,right為排
25                       序的結束位置。因此可以實現
26                       局部排序
27 
28     QuickSort(datas).show()  輸出結果
29     '''
30     def __init__(self, datas):
31         self.datas = datas
32 
33     def _sort(self, left, right):
34         # 排序函數,由兩個游標分別從兩端開始遍歷
35         # 左端數據要比基數小,所以判斷條件是遇到
36         # 比基數大的就要停下。
37         # 右端的情況與左端相反。
38         #
39         # 注意:程序一定要先從右端開始遍歷,因為
40         #       兩端遍歷最終停下的條件肯定是相遇
41         #       的時候,如果左端先移動,則最后停
42         #       下時的數值肯定比基數大,若將這個
43         #       數字與基數交換,則基數左邊的數字
44         #       就不是全部比基數小了,程序運行就
45         #       不正確了。
46         if(left > right):
47             return
48         temp = self.datas[left]
49         i = left
50         j = right
51         while i != j:
52             while(self.datas[j] >= temp and i < j):
53                 j -= 1
54 
55             while(self.datas[i] <= temp and i < j):
56                 i += 1
57 
58             if i < j:
59                 self.datas[i], self.datas[j] = \
60                         self.datas[j], self.datas[i]
61 
62         self.datas[left], self.datas[i] = self.datas[i], temp
63 
64         self._sort(left, i-1)
65         self._sort(i+1, right)
66 
67     def show(self):
68         print 'Result is:',
69         for i in self.datas:
70             print i,
71 
72         print ''
73 
74 if __name__ == '__main__':
75     try:
76         datas = raw_input('Please input some number:')
77         datas = datas.split()
78         datas = [int(datas[i]) for i in range(len(datas))]
79     except Exception:
80         pass
81 
82     qs = QuickSort(datas)
83     qs._sort(0, len(datas)-1)
84     qs.show()

最后有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*

掃碼關注或者搜索微信號:King_diary 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM