基於分治法的快速排序和歸併排序

2021-08-07 13:01:03 字數 1729 閱讀 1155

1) 把前一半排序

2) 把後一半排序

3) 把兩半歸併到乙個新的有序陣列,然後再拷貝回原陣列,排序完成。

每乙個子過程都進行歸併排序,整體用分治的思想(遞迴實現)

時間複雜度為o(nlogn)

是最快的排序演算法!

/*

函式mergeayyar()是歸併排序演算法

函式mergesort()是對每個子過程進行歸併排序,最後合併成最終的陣列

此演算法理解分治的思想不難,關鍵是搞清楚遞迴是如何實現分治的

也是此類演算法的關鍵

*/#include

using

namespace

std;

//歸併

void mergearray(int a,int first,int mid,int end,int temp)

k++;

}while(i<=n||j<=end)else

if(j<=end)

k++;

}for(int t=0;t1;t++)

} //排序

1)設k=a[0], 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 (o(n)時間完成)

2) 把k左邊的部分快速排序

3) 把k右邊的部分快速排序

時間複雜度o(nlogn)

速度也很快!

感覺這個比歸併排序好理解一點…

/*

快速排序很好理解

關鍵是分析透如何排序就好了

這個程式不是最好的**結構,不過是筆者自己解的,所以不想借鑑網上的多數的那個while迴圈的結構

*/#include

using

namespace

std;

//快速排序

int quickarray(int a,int first,int end,int n)

j--;

i++;

}return k;

}//遞迴

編譯器中自帶快速排序函式qsort(),具體用法自行google

演算法 分治法 快速排序,歸併排序

分治法,是演算法思想裡最基礎的思想。這也和人的基本思維有關,當我們需要解決乙個大的問題時,直覺的就會將這個大問題分成多個小問題來解決。大量的經典演算法,都是基於分治法。比如,快速排序,歸併排序。當然,最讓人想起來的,就是二分查詢了。分治,分而治之。分的原因是因為問題的規模太大,需要拆開了解決,目的是...

分治法 快速排序 歸併排序 堆排序

十種常見排序演算法可以分為兩大類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。0.2...

分治法,歸併排序

1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...