19 排序 歸併排序

2021-09-30 14:44:07 字數 1265 閱讀 9102

將已有序的子串行合併,得到有完全有序的序列

// leftstart=左邊陣列的起始位置,rightstart=右邊陣列的起始位置,rightend=右邊陣列的結束位置

void merge(elementtype a, elementtype tmpa, int leftstart, int rightstart, int rightend)

while (leftindex <= leftend) // 直接複製左邊剩下的

tmpa[tmpindex++] = a[leftindex++];

while (rightindex <= rightend) // 直接複製右邊剩下的

tmpa[tmpindex++] = a[rightindex++];

for (i = leftstart; i <= rightend; i++) // 將tmpa中的資料恢復到a中,如果在迴圈演算法中,不需要執行這個恢復過程

a[i] = tmpa[i];

}

分而治之

遞迴的把序列一分為二,直到序列只剩2個元素(可能有一組只有乙個元素)

進行子串行的合併

void msort(elementtype a, elementtype tmpa, int leftstart, int rightend)     

}

時間複雜度:t(

n)=o

(nlo

gn)

統一函式介面

void merge_sort(elementtype a, int n) 

msort(a, tmpa, 0, n - 1);

free(tmpa);

}

一趟歸併

對相鄰的兩段有序子列進行合併

兩兩子列進行合併,同一段子列不會在一趟歸併中參與兩次合併

需要額外處理剩餘的單個序列,保證最後把結果歸併到tmpa中

// sublen = 當前有序子列的長度

void merge_pass(elementtype a, elementtype tmpa, int n, int sublen)

統一函式介面
void merge_sort(elementtype a, int n) 

sublen = 1;

while (sublen < n)

free(tmpa);

}

04 排序 歸併排序

基本原理 對於給定的一組資料 假設有n個資料 首先將每兩個相鄰長度為1的子串行進行歸併,得到n 2個長度為2或者1的有序子串行,再將其兩兩合併,反覆此過程,得到乙個有序序列。package com.sort 歸併演算法 public class testmergesort else while i ...

演算法 1 排序 歸併排序

歸併排序思想 1.把長度為n的輸入序列分成兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個排序好的子串行合併成乙個最終的排序序列。小結 平均時間複雜度o nlogn 最好情況o nlogn 最壞情況o nlogn 空間複雜度o n 占用額外記憶體 穩定性 穩定 歸併排序入口 ...

3 排序演算法 歸併排序

問題描述 歸併排序演算法對下列例項排序,寫出基於歸併排序演算法對下面例項進行排序的具體過程。a 48,12,61,3,5,19,32,7 解題思想 將n個元素分成2個子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合。n 1是中止。如下 include include using na...