最全的最通俗易懂的演算法——排序演算法【1】
阿新 • • 發佈:2018-12-10
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遍】