這個算法系列主要是自己學習算法過程中動手實踐一下,寫這個文章作為筆記和分享個人心得,如有錯誤請各位提出。
注:轉載請說明出處
問題提出:
將以下數據升序排列: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