java 算法之歸并排序詳解及實(shí)現(xiàn)代碼
java 算法之歸并排序詳解
一、思想
歸并排序:將一個(gè)數(shù)組排序,可以先(遞歸地)將它分成兩半部份分別排序,然后將結(jié)果歸并起來(lái);
二、概念
歸并:將兩個(gè)有序的數(shù)組歸并成一個(gè)更大的有序數(shù)組;
三、特點(diǎn)
優(yōu)點(diǎn):能夠保證將任意長(zhǎng)度為N的數(shù)組排序所需要的時(shí)間和NlogN成正比;
缺點(diǎn):需要額外的空間和N成正比;
四、實(shí)現(xiàn)方法
將兩個(gè)不同的有序數(shù)組歸并到第三個(gè)數(shù)組中;
先將前半部分排序,在將后半部分排序,然后在數(shù)組中移動(dòng)元素而不需要使用額外的空間;
五、代碼
/**
* 歸并排序
*
* @author pengcx
*
*/
public class Merge extends Sort {
/** 歸并所需的輔助數(shù)組 */
private static Comparable[] aux;
public static void main(String[] args) {
String[] a = { "d", "a", "w", "b", "q" };
Merge.sort(a);
show(a);
}
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
/**
* 排序數(shù)組的a[lo]至a[hi]元素
*
* @param a
* 數(shù)組a
* @param lo
* 最小元素位置lo
* @param hi
* 最大元素位置hi
*/
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
// 計(jì)算數(shù)組中間位置
int mid = lo + (hi - lo) / 2;
// 排序數(shù)組a左邊的元素
sort(a, lo, mid);
// 排序數(shù)組a右邊的元素
sort(a, mid + 1, hi);
// 合并數(shù)組a左邊和右邊的元素
merge(a, lo, mid, hi);
}
/**
* 將數(shù)組a的a[lo]至a[mid]的元素與a[mid]至a[hi]的元素合并
*
* @param a
* 合并的數(shù)組a
* @param lo
* 最小數(shù)組元素lo
* @param mid
* 中間元素位置mid
* @param hi
* 最大元素位置hi
*/
public static void merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
// 如果左邊的元素用盡,取右邊的元素
if (i > mid) {
a[k] = aux[j++];
}
// 如果右邊的元素用盡,取左邊的元素
else if (j > hi) {
a[k] = aux[i++];
}
// 如果右半邊的當(dāng)前元素小于左半邊的當(dāng)前元素,取右半邊元素
else if (less(aux[j], aux[i])) {
a[k] = aux[j++];
}
// 如果右半邊的當(dāng)前元素大于等于左半邊的當(dāng)前元素,取左半邊元素
else {
a[k] = aux[i++];
}
}
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度的分析
本文主要介紹了java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
win10下定時(shí)運(yùn)行與開(kāi)機(jī)自啟動(dòng)jar包的方法記錄
這篇文章主要給大家介紹了關(guān)于win10下定時(shí)運(yùn)行與開(kāi)機(jī)自啟動(dòng)jar包的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時(shí)候需要使用線程安全的隊(duì)列,如果要實(shí)現(xiàn)一個(gè)線程安全的隊(duì)列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下2023-12-12
Nacos+Spring Cloud Gateway動(dòng)態(tài)路由配置實(shí)現(xiàn)步驟
Nacos最近項(xiàng)目一直在使用,本文通過(guò)gateway、nacos-consumer、nacos-provider三個(gè)簡(jiǎn)單模塊來(lái)展示:Nacos下動(dòng)態(tài)路由配置,,感興趣的小伙伴們可以參考一下2021-08-08
SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請(qǐng)求客戶端的實(shí)現(xiàn)
本文主要介紹了SpringBoot3 響應(yīng)式網(wǎng)絡(luò)請(qǐng)求客戶端的實(shí)現(xiàn),文章詳細(xì)闡述了如何使用SpringBoot3的網(wǎng)絡(luò)請(qǐng)求客戶端進(jìn)行HTTP請(qǐng)求和處理響應(yīng),并提供了示例代碼和說(shuō)明,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。2021-05-05
Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
SpringSecurity JWT基于令牌的無(wú)狀態(tài)認(rèn)證實(shí)現(xiàn)
Spring Security中實(shí)現(xiàn)基于JWT的無(wú)狀態(tài)認(rèn)證是一種常見(jiàn)的做法,本文就來(lái)介紹一下SpringSecurity JWT基于令牌的無(wú)狀態(tài)認(rèn)證實(shí)現(xiàn),感興趣的可以了解一下2025-04-04

