資料結構 歸併排序

2022-05-08 13:06:08 字數 3053 閱讀 5435

1、歸併排序(merge sort)

是建立在歸併操作上的一種有效的排序演算法,時間複雜度為o(n log n)。2023年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行。

將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

1、遞迴實現

(1)「分解」——將序列每次折半劃分。

(2)「合併」——將劃分後的序列段兩兩合併後排序。

#include

#define maxsize 10

void merge(int left, int leftsize, int right, int rightsize)

else

}//對未排放有序元素進行排放

for (; i < leftsize; i++)

for (; j < rightsize; j++)

////將區域性變數資料存放入left中

for (i = 0; i < (leftsize + rightsize); i++)

}void mergesort(int arr, int n)

}int main()

;mergesort(a, 10);

for (i = 0; i < 10; i++)

printf("%d ", a[i]);

system("pause");

return 0;

}歸併排序是穩定排序,它也是一種十分高效的排序,能利用完全二叉樹特性的排序一般效能都不會太差。

從上文的圖中可看出,每次合併操作的平均時間複雜度為o(n),而完全二叉樹的深度為|log2n|。總的平均時間複雜度為o(nlogn)。

而且,歸併排序的最好,最壞,平均時間複雜度均為o(nlogn)。

用迭代方式實現歸併排序的演算法:

非遞迴的方法,避免了遞迴時深度為log2n的棧空間,空間只是用到歸併臨時申請的跟原來陣列一樣大小的空間,並且在時間效能上也有一定的提公升,因此,使用歸併排序是,盡量考慮用非遞迴的方法。

}//上面迴圈結束的條件有兩個,如果是左邊的游標尚未到達,那麼需要把

//陣列接回去,可能會有疑問,那如果右邊的沒到達呢,其實模擬一下就可以

//知道,如果右邊沒到達,那麼說明右邊的資料比較大,這時也就不用移動位置了

while (left_min

//將合併的部分有序陣列返回原陣列

while (next > 0

) }}

}int

main()

;

//mergesort(a, 10);

mergesort2(a, 10

);

for (i = 0; i < 10; i++)

printf(

"%d

", a[i]);

system(

"pause");

return0;

}參考參考

鍊錶實現歸併排序:

public

class

hello

node(1);

node(9);

hello s= new

hello();

s.mergesort(head).toprint();

}public

node mergesort(node head)

private

node merge(node p1, node p2)

else

p=p.next;

}while(p1!=null

)

while(p2!=null

)

return

dummy.next;

}private

node findmiddle(node head)

node mid=slow.next; // 將鍊錶分為兩部分

}//把未結束的鍊錶連線到合併後的鍊錶尾部

while(p1!=null

)

while(p2!=null

)

return

l.next;}}

資料結構 歸併排序

排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...

資料結構 歸併排序

歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...

資料結構 歸併排序!!!

歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...