排序算法_06_歸併排序(附Java和python語言的編程實現)

歸併排序


基本思想:

歸併排序的過程也體現了一種“分而治之”的思想,再利用遞歸來加速了排序的過程,簡單來說就是先將待排序的數組一層層的若干個部分,最後每一個部分就一個元素,然後再開始合併的過程,來解決整個排序的過程,重點當然是在合併的過程,劃分的過程是採用遞歸實現的。


圖解示例

在這裏插入圖片描述

編碼提要:

(1)編碼的核心在合併的過程,合併的次數等於數組元素的個數減1,由此可見相比冒泡排序時間複雜度降低了很多;
(2)合併的過程需要一個臨時的數組,每次合併的過程,都是比較左右部分的數值,誰小就先拷貝到臨時數組,覺得這部分最好自己動手調試一下代碼,這樣理解起來會感覺更踏實


java語言的編程實現

package com.cc.sortcollection;

import java.util.Arrays;

/**
 * @Classname Code_06_MergeSort
 * @Description TODO
 * @Date 2020/2/29 11:41
 * @Created by dreamBreathing
 */
public class Code_06_MergeSort {
    public static void main(String[] args) {
        int[] arr = {6, 2, 5, 1, 3, 7, 8, 4};
        System.out.println("排序前的數組爲:" + Arrays.toString(arr));
        mergeSort(arr, 0, arr.length - 1);
        System.out.println("排序後的數組爲:" + Arrays.toString(arr));
    }

    public static void mergeSort(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = (left + right) / 2;
        //向左遞歸進行分解
        mergeSort(arr, left, mid);
        //向右遞歸進行分解
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = 0;
        int p1 = left;
        int p2 = mid + 1;
        //比較左右兩部分的元素,將較小的放入到臨時數組temp中
        while (p1 <= mid && p2 <= right) {
            temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= mid) {
            temp[i++] = arr[p1++];
        }
        while (p2 <= right) {
            temp[i++] = arr[p2++];
        }
        //再將排序在臨時數組的結果還原給原始數組
        for (int j = 0; j < temp.length; j++) {
            arr[left + j] = temp[j];
        }
    }
}


python語言的編程實現

# -- coding: utf-8 --
# @Time : 2020/3/1 8:06
# @Author : dreamBreathing
# @File : mergeSort.py
# @Software: PyCharm


def merge_sort(tag_list, left, right):
    if left == right:
        return
    mid = (left + right) // 2
    # 向左遞歸進行分解
    merge_sort(tag_list, left, mid)
    # 向右遞歸進行分解
    merge_sort(tag_list, mid + 1, right)
    # 開始合併
    merge(tag_list, left, mid, right)


def merge(tag_list, left, mid, right):
    temp_list = []
    p1, p2 = left, mid+1
    while p1 <= mid and p2 <= right:
        if tag_list[p1] <= tag_list[p2]:
            temp_list.append(tag_list[p1])
            p1 += 1
        else:
            temp_list.append(tag_list[p2])
            p2 += 1
    while p1 <= mid:
        temp_list.append(tag_list[p1])
        p1 += 1
    while p2 <= right:
        temp_list.append(tag_list[p2])
        p2 += 1
    # 再將排序在臨時列表的數據拷貝回原始列表
    for i in range(0, len(temp_list)):
        tag_list[left + i] = temp_list[i]


if __name__ == "__main__":
    list1 = [1, 3, -2, 4, 7, 11, -5]
    print("排序前:", list1)
    merge_sort(list1, 0, len(list1)-1)
    print("排序後:", list1)

(ps:這部分的學習,給大家分享一個不錯的博客(點擊此處),可能我的博客裏的圖畫的不好看,大家見諒)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章