將一組無序陣列變為有序(文中暫定為:陣列=向量)
先考慮兩個有序向量如何合併成為乙個新的有序向量:
我們可以認為任務目標想獲得的有序向量是由有序向量a和b組成,其中有序向量a又是由兩個有序向量a1和a2組成,對b、a1、a2繼續往下分,直到向量中元素個數為1,此時,該向量自然是有序的。(這就是在遞迴)
(這就是分治策略,將乙個問題分為兩個子問題去求解)
顯然易見,元素個數為n的無序向量最終可分為n個元素個數為1的有序向量,將這n個有序向量兩兩合併,則每次合併出來的向量必然是有序的,形成了n/2個元素數量為2的有序向量,再將這些有序向量合併,以此類推,最終形成元素個數為n的有序向量。
通過反覆的遞迴呼叫將獲得的有序向量合併成為新的有序向量以形成最終的有序向量
using system;
using system.collections.generic;
using system.diagnostics.eventing.reader;
using system.linq;
using system.text;
using system.threading.tasks;
namespace mergesort
program ps = new program();
ps.mergesort(a,0,a.length);
console.writeline("排序結果:");
foreach (int a in a)
console.readkey();
}public void mergesort(int a,int lo,int hi)//左開右閉區間[lo,hi)
public void mergesortedarray(ref int a,int lo,int hi)
j =0;
//獲取temp的中間位置
int k = temp.length >> 1;
int middle = temp.length >> 1;
//比較前半部分和後半部分,即比較兩個有序向量
//將小的元素賦值給a的對應位置處
【元素已經有序或接近有序】例如,對a=和a=,如果我們能做出陣列有序的判斷,就可提前退出排序演算法的執行,提高效率。
歸併排序可以做出陣列有序的判斷嗎?
不可以,所以即使在最好的情況下,仍然需要完整的執行一遍演算法。
【有多個相同的元素】排序前後相同元素的相對次序不會改變
對於a=這樣乙個陣列
氣泡排序的比較順序是:1和2比,2和3比,3和4比······;一趟比較下來,可以判斷陣列是否有序;第二趟比較仍是1和2比,2和3比,3和4比······全部是單對單比較
歸併排序的比較順序是:1和2比,3和4比,5和6比······,一趟比較下來,不能判斷陣列是否有序(2和3沒比過,4和5 沒比過);第二趟比較是1、2作為整體和3、4比較,5、6作為整體和7、8比較······是劃分區域整體比較
[1]鄧俊輝.資料結構(c++語言版)第三版[m]
排序演算法c#實現之氣泡排序詳解
排序演算法c#實現之插入排序詳解
排序演算法c#實現之選擇排序詳解
C 歸併排序演算法詳解
目錄 歸併排序演算法的平均時間複雜度是o nlogn 歸併演算法的實現就是通過分冶法,將乙個待排序列分成乙個程式設計客棧個小的序列,然後對這些小的序列進行排程式設計客棧序,然後進行合併,合併的時候也會進行排序,這樣,從整體拆成小塊,再從小塊合成整體的乙個過程。1 拆分待排序列 2 進行排序合併 給大...
排序演算法之歸併排序及C 實現
歸併排序思想 將原陣列拆成前後兩半,遞迴地對前半部分和後半部分分別執行排序過程,再將排好序的前後兩部分合併。典型的分治問題,而分治一般用遞迴去解。歸併排序也是基於比較的排序。歸併排序穩定。template typename t void merge t arr,int l,int m,int r,t...
排序演算法 詳解歸併排序演算法
原理,首先將陣列遞迴的分解,直到達到終止條件返回,然後將分成兩段的陣列,進行比較,按從小到大的順序放在臨時陣列裡,然後將這一段排好順序的陣列複製給原來的陣列,繼續返回上一層,進行排序。直到完全完成遞迴。第二段結束了,第一段還有 if begin1 end1 第一段結束了,第二段還有 else 每次都...