非比較排序 歸併排序

2021-08-04 03:06:06 字數 1124 閱讀 1805

一、歸併排序的思想

歸併排序利用了分冶的思想,將一塊待排序的區間,取中間位置,分成兩段區間;然後通過不斷的遞迴,直到每段區間只有乙個數字,這時我們就認為該段區間有序,然後將這相鄰的兩段有序區間合併為乙個有序區間;

這樣通過遞迴先**陣列,然後再合併陣列,就完成了歸併排序;

二、**實現

#include

#include

using

namespace

std;

//合併兩個有序的相連的區間[begin1,end1]和[begin2,end2]

void merge(int* arr,int* tmp,int begin1,int end1,int begin2,int end2)

}while(begin1<=end1)

while(begin2<=end2)

memcpy(arr+pos,tmp+pos,sizeof(int)*(end2-pos+1));

}//**陣列

void _merge(int* arr,int* tmp,int left,int right)

int mid=left+(right-left)/2;

_merge(arr,tmp,left,mid);

_merge(arr,tmp,mid+1,right);

merge(arr,tmp,left,mid,mid+1,right);

}//歸併排序

void mergesort(int* arr,int sz)

void printf(int* arr,int sz)

cout

; int sz=sizeof(arr)/sizeof(arr[0]);

mergesort(arr,sz);

printf(arr,sz);

return

0;}

三、**

四、時間空間複雜度:

(1)時間複雜度:o(n*logn);

(2)空間複雜度:o(n)

開闢了一塊和數列長度相等 的陣列;

四 歸併排序 非比較排序 歸併排序 計數排序

基本思想 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸...

非比較排序

以下內容參考自 演算法導論 基於比較的排序演算法可以用一顆完全二叉樹 決策樹 來表示,節點表示每一次的比較過程,葉子節點表示最終的排序順序,葉子節點一共有n 個 n表示資料個數,一共有n 種排列方式 二叉樹的高度h就是比較的次數,由二叉樹的性質,葉子節點的個數不大於2 h,所以有 2 h n 2 h...

非比較排序

計數排序 n個輸入元素的每乙個都是在0到k之間的整數 k為某個整數 1.假設輸入陣列是a 1.n 還需要兩個陣列 b 1.n 存放排序的輸出,c 0.k 提供臨時儲存空間 2.c i 中存放等於 i 的元素的個數,i 0,1,k 3.通過相加計算確定有多少元素是小於等於i的 4.把每個元素a i 放...