1. 程式人生 > >歸併排序-分治演算法

歸併排序-分治演算法

一、歸併排序思想

基本思想:採用分治演算法,將要排序的陣列分為兩個部分,先分別對這兩個部分進行排序,然後再將兩部分已經排好序的子陣列進行合併,最後形成一個有序的陣列。

二、時間複雜度為

這裡寫圖片描述

三、原始碼示例


#include "stdafx.h"
#define N 6

int A[N] = {9,4,1,6,8,7};

/*
    陣列A[low...mid]和A[mid+1...high]已排好序,將其合併為一個有序陣列
*/
void Merge(int low, int mid, int high)
{
    int h, iptr, j, k;
    int
B[N]; h = low; iptr = low; j = mid + 1; while (h <= mid && j <= high) { if (A[h] <= A[j]) { B[iptr] = A[h]; h++; } else { B[iptr] = A[j]; j++; } iptr++; } if
(h > mid) { for (k = j; k <= high; k++) { B[iptr] = A[k]; iptr++; } } else { for (k = h; k <= mid; k++) { B[iptr] = A[k]; iptr++; } } for (k = low; k <= high; k++) A[k] = B[k]; } void MergeSort(int
low, int high) { if (low < high) { int mid = (low + high) / 2; MergeSort(low, mid); MergeSort(mid + 1, high); Merge(low, mid, high); } } int main() { printf("歸併排序前:\n"); for (int i = 0; i < N; i++) printf("%d\t", A[i]); MergeSort(0, N - 1); printf("\n\n********************************************************\n\n歸併排序後:\n"); for (int i = 0; i < N; i++) printf ("%d\t", A[i]); printf("\n\n\n\n"); return 0; }

四、結果截圖

這裡寫圖片描述