defshell_sort(arr):n =len(arr)gap = n//2while gap >0:for i inrange(gap,n):while i >0:if arr[i]>arr[i-gap]:i -= gapelse:arr[i],arr[i-gap]=arr[i-gap],arr[i]gap = gap //2
defquick_sort(arr,first,end):'''快速排序.不新建列表,加起始位置:param arr: 待排序的列表:param first: 待排序的列表的起始位置:param end: 待排序的列表結束位置:return:無選擇待排序數組的第一個元素pivot,確定它的位置.'''l = arr[first:end+1]if first >= end:returnpivot = arr[first]left = first# 數組頭部指針right = end# 數組尾部指針while left< right:while left < right and arr[right]>= pivot:right -=1arr[left]= arr[right]while left < right and arr[left]<= pivot:left +=1arr[right]= arr[left]arr[left]= pivotquick_sort(arr,first,left-1)quick_sort(arr,left+1,end)
歸并排序 1) 先將數組對分對分,直至變成單個元素 2) 然后兩兩比較合并,知道變成一個有序的序列 3) 歸并排序過程比較像中根遍歷的過程。 a. 排序arr[0,n],拆分成arr[0,n/2]和arr[n/2,n]的排序問題 b. 先看左邊,arr[0,n/2]排序。查分成arr[0,n/4]和arr[n/4,n/2]的排序問題。假如n=4.現在arr[0,n/4]和arr[n/4,n/2]成了單個元素排序,返回列表本身。 c. 接下來就是合并了。合并arr[0,n/4]和arr[n/4,n/2],就解決了arr[0,n/2]。 d. 為了解決arr[0,n]排序,還需要處理arr[n/2,n]的排序問題。與左半部分類似 歸并排序的將排序的數組的長度對半分,它的時間復雜度是O(nlog(n))O(nlog(n))O(nlog(n)),但是需要額外的存儲空間,加上數據存取的時間,是否比前面的一些排序算法的素的快,值得商榷。