舉例講解C語言對歸併排序演算法的基礎使用

2022-10-04 01:51:06 字數 1022 閱讀 7975

基礎概念

百度百科是這麼描述歸併排序的:

歸併操作(merge),也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。

設有數列

初始狀態:

[6] [202] [100] [301] [38] [8] [1]

比較次數&nbcgacrkhsp;

i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3

i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4

i=3 [ 1 6 8 38 100 202 301 ] 4

總計: 11次

例項#include

void printarr(int arr,int length);

int i;

for(i=0;i程式設計客棧

演算法效能/複雜度

歸併排序的效率是很高的,由於遞迴劃分為子串行只需要logn複雜度,而合併每兩個子串行需要大約2n次賦值,為o(n)複雜度,因此,只需要簡單相乘即可得到歸併排序的時間複雜度 o(㏒n)。並且由於歸併演算法是固定的,不受輸入資料影響,所以它在最好、最壞、平均情況下表現幾乎相同,均為o(㏒n)。

但是,歸併排序最大的缺陷在於其空間複雜度。從上面的**可以看到,在合併子陣列的時候需要乙個輔助陣列,然後再把這個資料拷貝回原陣列。所以,歸併排序的空間複雜度(額外空間)為o(n)。可不可以省略這個陣列呢?不行!如程式設計客棧果取消輔助陣列而又要保證原來的陣列中資料不被覆蓋,那就必須要在陣列中花費大量時間來移動資料。不僅容易出錯,還降低了效率。因此這個輔助空間是少不掉的。

演算法穩定性

因為我們在遇到相等的資料的時候必然是按順序「抄寫」到輔助陣列上的,所以,歸併排序同樣是穩定演算法。

演算法適用場景

歸併排序在資料量比較大的時候也有較為出色的表現(效率上),但是,其空間複雜度o(n)使得在資料量特別大的時候(例如,1千萬資料)幾乎不可接受。而且,考慮到有的機器記憶體本身就比較小,因此,採用歸併排序一定要注意。

本文標題: 舉例講解c語言對歸併排序演算法的基礎使用

本文位址:

mysql多路歸併排序 C語言歸併排序演算法

用歸併排序法對一組資料由小到大進行排序,資料分別為 695 458 362 789 12 15 163 23 2 986。實現過程 1 自定義函式 merge 實現一次歸併排序。2 自定義函式 merge sort 實現歸併排序。3 程式 如下 include int merge int r,int...

C語言排序演算法之歸併排序

排序演算法中的歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low m r m 1 high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完成後將...

自然歸併排序演算法(C語言)

例 a 自然歸併排序指的是對陣列先進行一次線性掃瞄,得到自然排好序的子數段,在對其進行兩兩合併成更大的排好序的陣列。include define n 8 int getindex int a n int index n index j n 後面mergesort中合併需要判斷i的範圍,否則index...