常見的排序演算法
阿新 • • 發佈:2018-12-19
# --*-- coding=utf-8 --*-- class Solution: def bubbe_sort(self,nums): """ 氣泡排序: 比較n-1趟,每一趟比較m次 每一趟把相鄰的大的數放在右邊 時間複雜度為O(N^2) :param nums: :return: """ for i in range(len(nums)-1,-1,-1): for j in range(i): if nums[j]>nums[j+1]: nums[j],nums[j+1]=nums[j+1],nums[j] def select_sort(self,nums): """ 選擇排序: 跟氣泡排序類似,只不過先找出最小的數在交換 時間複雜度:O(N^2) 例如,對5,3,8,6,4這個無序序列進行簡單選擇排序, 首先要選擇5以外的最小數來和5交換,也就是選擇3和5交換, 一次排序後就變成了3,5,8,6,4.對剩下的序列一次進行選擇 和交換,最終就會得到一個有序序列。 :param nums: :return: """ for i in range(len(nums)-1): min_index=i for j in range(i+1,len(nums)): if nums[j]<nums[min_index]: min_index=j nums[min_index],nums[i]=nums[i],nums[min_index] def insert_sort(self,nums): """ 插入排序:類似於整理撲克牌 就是拿到一張牌,找到一個合適的位置插入。 例如,對5,3,8,6,4這個無序序列進行簡單插入排序, 首先假設第一個數的位置時正確的,然後3要插到5前面, 把5後移一位,變成3,5,8,6,4. 然後8不用動,6插在8前面,8後移一位,4插在5前面, 從5開始都向後移一位。 :param nums: :return: """ for i in range(len(nums)): for j in range(i,0,-1): if nums[j]<nums[j-1]: #這裡用到了一個技巧,通過交換實現插入(這裡類似冒泡) nums[j],nums[j-1]=nums[j-1],nums[j] def quick_sort(self,nums,i,j): """ 快速排序: 思路:右指標j(從右往左掃描)找比基準數小的停, 左指標i(從左往右掃描)找比基準數大的停,交換i,j所指的數, 繼續,直到i,j相遇,然後交換基準數(第一個數)與相遇點的數,此時base基準數,左邊的都比它小,右邊的都比它大, 遞迴左右兩邊,完成排序 例如:對5,3,8,6,4進行快速排序 5,3,8,6,4 用5作為比較的基準,最終會把5小的移動到5的左邊,比5大的移動到5的右邊; 5,3,8,6,4 首先設定i,j兩個指標分別指向兩端,j指標先掃描4比5小停止; 然後i掃描,8比5大停止。交換i,j位置; 5,3,4,6,8 然後j指標再掃描,這時j掃描4時兩指標相遇。停止。然後交換4和基準數; 4,3,5,6,8 一次劃分後達到了左邊比5小,右邊比5大的目的。之後對左右子序列遞迴排序, 最終得到有序序列。 時間複雜度:O(nlogn) :param nums: :return: """ index_base=i b1,b2=i,j if i>=j: return while i!=j: while nums[j]>=nums[index_base] and i!=j: j-=1 while nums[i]<=nums[index_base] and i!=j: i+=1 if i!=j: nums[i],nums[j]=nums[j],nums[i] nums[i], nums[index_base] = nums[index_base], nums[i] self.quick_sort(nums,b1,i-1) self.quick_sort(nums, i+1, b2) if __name__=='__main__': so=Solution() #nums=[5,3,8,6,4] nums =[45, 32, 8, 33, 12, 22, 19, 97] #so.bubbe_sort(nums) #so.select_sort(nums) #so.insert_sort(nums) so.quick_sort(nums,0,len(nums)-1) print(nums)