歸併排序
基本思想:
歸併排序的過程也體現了一種“分而治之”的思想,再利用遞歸來加速了排序的過程,簡單來說就是先將待排序的數組一層層的若干個部分,最後每一個部分就一個元素,然後再開始合併的過程,來解決整個排序的過程,重點當然是在合併的過程,劃分的過程是採用遞歸實現的。
圖解示例
編碼提要:
(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:這部分的學習,給大家分享一個不錯的博客(點擊此處),可能我的博客裏的圖畫的不好看,大家見諒)