歸併排序的遞迴形式與非遞迴形式 C 版

2021-07-11 08:30:14 字數 1264 閱讀 1111

歸併排序的核心思想是分治法,即將待排序資料分成多個小塊,對每個小塊進行排序,然後在兩兩合併小塊,最終完成對整體的排序

時間複雜度是nlogn

輸入:25,12,17,21,15,48

結果:

遞迴實現:遞迴類似於對此方法的場景再現,即先對整體進行劃分,然後對劃分後的部分進行排序(對遞迴函式的理解可以認為是從上層向下層進入),排序好之後再進行合併(可以認為是從下層上層開始返回)**如下:

//歸併排序

void mergesort(int arr,int length)

//把檢查邊緣問題放在遞迴迴圈的外側

void mergesortrecursion(int arr,int low,int high)//high表示最高座標

else

}if(i<=mid)

if(j<=high)

//返還給arr

curtmp=0;

for(int i=low;i<=high;i++)

arr[i]=tmp[curtmp++];

delete tmp;

}

非遞迴的實現是對遞迴形式的模擬,但是不能夠實現從上到下在由下到上的返回,因此我們之間利用從下向上返回的模擬,利用step一步一步上向上層爬,一直爬到最上層,具體**如下:

//非遞迴

void mergesortnonrecursion(int arr,int length)//length表示陣列長度

else

}if(p<=lefttopos)

if(q<=righttopos)

//返還給arr

for(int j=left;j<=righttopos;j++)

i+=2*step;

} step*=2;

} delete tmp;

}

其中對於引數陣列進行說明:c++中傳遞引數分為傳值和傳址,其中基本資料型別是傳值即生成乙個新的副本儲存在呼叫函式的棧空間中,因此對其進行內容修改不會對原資料造成資訊改動;當進行傳址引用的時候對呼叫函式內的該資料進行改動的時候可以修改原資料資訊。陣列作為引數進行傳遞的時候缺省會退化成指標型別,此處相當於傳址所以可以改動原資料資訊。

陣列做引數退化成指標型別

演算法 歸併演算法的遞迴與非遞迴形式

歸併演算法是將兩個或兩個以上的有序表組合成乙個新的有序表,它的原理是 假設初始序列含有n個記錄,則可以看成是n個有序子串行,兩兩歸併,得到 n 2 個有序子串行,再次歸併 不斷重複直至歸併到長度為n的有序序列,這樣的排序方法稱為2路歸併排序。例項一 遞迴形式的2路歸併演算法 define maxsi...

快速排序的遞迴形式與非遞迴形式 C 版

快排的理解 設要排序的陣列是 a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產...

歸併排序(遞迴與非遞迴)

1.遞迴 把序列分成元素個數盡量相等的兩部分,再將兩半分別排序,合併有序的兩個序列 遞迴 void merge sort int a,int low,int heigh,int t a為待排序陣列,low,high分別為a的上下限 0 n 1 t為輔助陣列 for i low,j 0 i heigh...