自然合併排序

2021-09-28 20:37:15 字數 865 閱讀 3274

自然合併排序演算法是對合併排序演算法的一種改進。設 a[0:n-1]是無序陣列,用一次對陣列a的掃瞄可以找出其中 自然排好序的子陣列,然後將相鄰的排好序的子陣列段兩 兩合併,繼續合併相鄰排好序的子陣列段,直至將整個數 組排好序。

code:

#include #include using namespace std;

int getindex(int *a, int *t, int n)

return cnt;

}// 合併a中有序的兩段子陣列到b對應的位置

// l是第乙個有序子陣列段的起始下標

// m是第乙個有序子陣列段的末尾下標

// r是第二個有序子陣列段的末尾下標

void merge(int *a, int *b, int left, int mid, int right)

// 合併兩段中的剩餘部分

while(i <= mid) b[k++] = a[i++];

while(j <= right) b[k++] = a[j++];

}void mergepass(int *a, int *b, int *t, int s, int n, int cnt)

// 剩餘未合併的不足s

if(i + s < cnt)

merge(a, b, t[i], t[i+s] - 1, n-1);

else if(i < cnt)

for(int j = t[i]; j <= n-1; j++)

b[j] = a[j];

}void mergesort(int *a, int *t, int n, int cnt)

}int main()

自然合併排序

我們知道歸併排序是將乙個無序的陣列兩兩劃分,最終劃分成每個組內有序的子元素,組後再將若干個組內有序的元素合併成乙個完整有序的陣列。這個思路可以使用遞迴和非遞迴演算法來實現,我在此主要講自然合併排序 自然合併排序當然也是合併排序,所謂的自然只不過就是指 所劃分的子陣列不在是兩兩劃分,而是每乙個子陣列都...

分治 合併排序 自然合併排序(C )

演算法步驟 引用自 菜鳥教程 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟 3 直到某一指標達到序列尾 將另一串行剩下的所有元素直...

自然合併排序演算法

合併排序基本思想 將待排序元素分成大小大致相同 可以不等長 的兩個子集和,分別對兩個子集合進行排序,最終將排好序的子集合合併成所要求的排好序的集合。遞迴版 void mergesort int a,int left,int right void mergepass int x,int y,int s...