1. 程式人生 > >常見的排序演算法

常見的排序演算法

# --*-- 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)