c語言寫歸併排序

2021-10-06 03:55:30 字數 1255 閱讀 3019

歸併排序,在實際開發中,很少用,但是為什麼一定要掌握它,甚至在面試中經常會問到。

其實,只是為了更好的理解演算法。歸併排序最核心的就是分治策略,所謂分治,就是把乙個問題,拆分成若干個小問題然後求解。掌握歸併排序以後,在遇到更複雜的問題,我們可以考慮分治策略。

歸併排序是穩定的,時間複雜度是o(nlogn),空間複雜度是o(n)。

廢話少說了,以下是我畫的醜陋的分治圖,湊合看吧。

以下是c**:

#include #include #include /*

*@func:合併被middle分割的兩個陣列,以下稱為左右兩部分

*@input:data陣列,start開始位置,middle中間位置,end結束位置

*@output:void

*/void merger(int *data,int start,int middle,int end)else

}//檢查左邊部分是否合併完

while(i <= middle)

//檢測右邊部分是否合併完

while(j <= end)

//把有序的temp陣列中的資料複製到我們要的data陣列中

memcpy(&data[start],temp,sizeof(int)*len);

free(temp);

}void mergersort(int *data,int start,int end)

}void call_merger_sort(int *data,int size)

void show_numbers(int *data,int size)

printf("\n");

}//test...

int main(void );

int size = sizeof(data)/sizeof(data[0]);

printf("start sort:\n");

show_numbers(data,size);

sort(data, size);

printf("end sort:\n");

show_numbers(data, size);

}

輸出結果:

歸併排序 C語言

今天寫的是歸併排序,歸併排序的定義為 依次將每兩個相鄰的有序表合併成乙個有序表的排序方法。最經常使用的歸併方法是2 路歸併。假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的...

C語言小白歸併排序

歸併排序採用分治法,排序速度快,排序中不改變輸入順序 主要思路乙個陣列進行二分,再將左右分別進行二分直至只有乙個數 即有序 再合併陣列使其有序,完成排序 include include void merge int sourcearr,int temparr,int startindex,int m...

C語言歸併排序

描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。歸併排序有兩個關鍵點 1.將兩個已經排好序的序列進行合併。歸併2個有序序列為1個有序序列 void merg...