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 先分在和...