---
# System prepended metadata

title: Merge Sort合併排序
tags: [Datastruction, Algorithm]

---

# 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
```