Python排序演算法(二) 快速排序、希爾排序、歸併排序
阿新 • • 發佈:2018-12-10
這篇文章有的排序演算法是:快速排序、希爾排序、歸併排序。
快速排序
''' 快速排序 ''' def quick_sort(aList, first, last): if first >= last: return min_val = aList[first] low_index = first hight_index = last while low_index < hight_index: # hight 左移動 while low_index < hight_index and min_val <= aList[hight_index]: hight_index -= 1 aList[low_index] = aList[hight_index] # low 右移動 while low_index < hight_index and min_val > aList[low_index]: low_index += 1 aList[hight_index] = aList[low_index] aList[low_index] = min_val # 左邊 quick_sort(aList, first, low_index - 1) # 右邊 quick_sort(aList, low_index + 1, last) if __name__ == "__main__": li = [54, 26, 93, 17, 77, 31, 44, 55, 20] # li = [26, 93, 54] print(li) quick_sort(li, 0, len(li) - 1) print(li)
快速排序的思路是:
1、從列表中找出一個元素,min_val 作為“基準”元素。
2、然後對列表進行排序,排序的規則是,比min_val基準元素小的放在基準元素的左邊,比min_val 基準元素大的放在基準元素的右面。這個時候基準元素就在這個列表的中間的位置。這個稱為分割槽操作。
3、遞迴進行操作,就是在把基準元素左邊的元素當做一個列表重複第2步操作,把基準元素左邊的元素當做一個列表重複第2步操作。
歸併排序
''' 歸併排序 ''' def merge_sort(aList): n = len(aList) if n <= 1: return aList mid = n//2 left_li = merge_sort(aList[:mid]) right_li = merge_sort(aList[mid:]) left_pointer, right_pointer = 0, 0 result = [] while left_pointer < len(left_li) and right_pointer < len(right_li): if left_li[left_pointer] <= right_li[right_pointer]: result.append(left_li[left_pointer]) left_pointer += 1 else: result.append(right_li[right_pointer]) right_pointer += 1 result += left_li[left_pointer:] result += right_li[right_pointer:] return result if __name__ == "__main__": li = [54, 26, 93, 17, 77, 31, 44, 55, 20] print(li) a = merge_sort(li) print(a)
歸併排序的思路是:
1、歸併排序的思想就是先遞迴分解陣列,再合併陣列。
2、然後將兩個列表第一個元素進行比較,將小的資料push到新的列表裡面。
希爾排序
''' 希爾排序 ''' def shell_sort(aList): n = len(aList) gap = n // 2 while gap > 0: for j in range(gap, n): i = j while i > 0: if aList[i] < aList[i - gap]: aList[i - gap], aList[i] = aList[i], aList[i - gap] i -= gap else: break gap //= 2 if __name__ == "__main__": li = [54, 26, 93, 17, 77, 31, 44, 55, 20] print(li) shell_sort(li) print(li)