1. 程式人生 > >最全的最通俗易懂的演算法——排序演算法【1】

最全的最通俗易懂的演算法——排序演算法【1】

1、氣泡排序

氣泡排序的基本思想就是:從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大(小)的資料元素交換到了無序佇列的隊尾,從而成為有序序列的一部分;下一次繼續這個過程,直到所有資料元素都排好序。

# python [升序的排序]
s = [3,4,5,6,7,12,11]
n = len(s)
i=0
j=0

for i in range(len(s)-1):
    for j in range(len(s)-1-j):
'''
len(s)-1-j解釋:這裡減去j的意思是,最大的數已經在最下面沒必要比較了。
'''
        if s[j]>s[J+1]:
            temp = s[j+1]
            s[j+1] = s[j]
            s[j] = temp
print (s) 
########升序and 降序程式碼,改變判斷符號即可
s = input().split()
n = len(s)
i =0
j =0

for i in range(n-1):
    for j in range(n-1):
        if s[n-j-2]<s[n-j-1]:
            temp = s[n-j-2]
            s[n-j-2]=s[n-j-1]
            s[n-j-1]=temp
print(s)

當原始序列“正序”排列時,氣泡排序總的比較次數為n-1,移動次數為0,也就是說氣泡排序在最好情況下的時間複雜度為O(n)

當原始序列“逆序”排序時,氣泡排序總的比較次數為n(n-1)/2,移動次數為3n(n-1)/2次,所以氣泡排序在最壞情況下的時間複雜度為O(n^2)

當原始序列雜亂無序時,氣泡排序的平均時間複雜度為O(n^2)

2、快速排序【C.R.A.Hoare 於1960年提出】

                                                     å¾çæ¥èªç»´åºç¾ç§

解題思想:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。 

原理:通過掃描將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。【官方說法,賊拗口】

白話原理:對於無序數列,我們取出其中一位數a,比a大的放右邊,比a小的放左邊。依次下去,在取值b,就是我們上面個的動圖。下面的樹形狀也很好理解。

                                           

上述的動圖and樹狀圖可以很好的展示快速排序的方法原理。【夠不夠明顯,夠不夠白話】

##最簡單的快速排序解法
def quicksort (a):
    if len(a) == 0 :
        return []
    else:
        pivot = a[0]
        left = []
        right = []
        mid = []
        for x in a:
            if x < pivot:
                left.append(x)
            elif x > pivot:
                right.append(x)
            else:
                mid.append(pivot)
'''
這裡注意,如果沒有mid,遞迴會報錯,python預設遞迴次數989,會陷入死迴圈。
'''
        return quicksort(left) + mid +quicksort(right)
nums = [6,1,2,7,9,3,4,5,10,8]
print (quicksort(nums))

這個是按照最簡單的思維去寫,程式的模型看看上面的白話解釋、白話解釋、白話解釋【重要的事說3遍】