# Merge Sort合併排序 ###### tags: `Algorithm` `Datastruction` ![](https://i.imgur.com/3zma7dN.png) 使用了演算法策略divide-and-conquer,將原本問題分為兩個子問題,一個比基準值小,一個比基準值大,再分別解決各自子問題,且在子問題中利用遞迴使用相同演算法來解決問題。 python code: ```python= # -*- coding: utf-8 -*- from __future__ import print_function def quick_sort(data): size = 0 i = 0 print('\nPlease enter number to sort (enter 0 when end): ') # 要求輸入資料直到輸入為零 while True: i += 1 data.append(int(input('#%d number: ' % i))) if data[size] == 0:#輸入0跳出 break size += 1 for i in range(60): print('-', end = '') print() sorting(data, 0, size-1, size)#進入另個程式區塊 for i in range(60): print('-', end = '') print('\nFinal sorted data: ', end = '') for i in range(size): print(data[i], ' ', end = '') def sorting(data, left, right, size): #left與right分別代表整個資料的兩端,以首data當成基準值 if left < right: lbase = left + 1#以第二筆作為初始lbase while data[lbase] < data[left]:#向右移動,與基準值做比較 if lbase+1 > size: break lbase += 1 rbase = right#最後一筆作為初始rbase while data[rbase] > data[left]:#向左移動,與基準值做比較 rbase -= 1 while lbase < rbase: # 若lbase小於rbase,注意這裡是index,則將兩筆的資料對調 data[lbase], data[rbase] = data[rbase], data[lbase] lbase += 1#lbase向右移動 while data[lbase] < data[left]:#若小於基準值,則繼續往右找 lbase += 1 rbase -= 1 while data[rbase] > data[left]:#若大於left的值,則繼續往左找 rbase -= 1 data[left], data[rbase] = data[rbase], data[left] # 此時lbase大於rbase,則rbase的資料與第一筆對調 print('Sorting: ', end = '') for i in range(size): print('%4d' % data[i], end = '') print() #divide-and-conquer:分為兩個子循環,一個是基準值左邊,一個是基準值右邊 sorting(data, left, rbase-1, size)#排左邊(遞迴) sorting(data, rbase+1, right, size)#排右邊(遞迴) def main(): data = [] quick_sort(data) main() 8 ```