圖解Java經典算法歸并排序的原理與實現(xiàn)
更新時間:2022年09月09日 10:49:43 作者:Binaire-沐辰
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide?and?Conquer)的一個非常典型的應用。本文將通過動圖詳解歸并排序的原理及實現(xiàn),需要的可以參考一下
歸并排序
歸并排序主要分成兩部分實現(xiàn),分、合兩部分,分是把數組分成兩半,再遞歸的對子數組進行 分 操作,直到分成一個個單獨的數。合是把兩個數組合并為有序數組,在對有序數組進行合并,直到全部子數組合并為一個完整的數組。
算法原理
- 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
- 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
- 比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
- 重復步驟c直到某一指針超出序列尾
- 將另一序列剩下的所有元素直接復制到合并序列尾
動圖演示

代碼實現(xiàn)
public class MergeSort {
//歸并所需的輔助數組
private static Comparable[] assist;
//比較 v 是否小于 w
public static boolean less(Comparable v,Comparable w){
return v.compareTo(w) < 0;
}
//數組元素交換位置
private static void swap(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//排序
public static void sort(Comparable[] a){
//初始化輔助數組
assist = new Comparable[a.length];
int l = 0;
int h = a.length - 1;
sort(a,l,h);
}
private static void sort(Comparable[] a,int l,int h){
if (h <= l){
return;
}
//分組
int mid = l +(h - l) / 2;
//分別對每組數據排序
sort(a,l,mid);
sort(a,mid + 1,h);
//對數組進行歸并
merge(a,l,mid,h);
}
//對數組進行歸并
private static void merge(Comparable[] a,int l,int mid,int h){
//定義三個指針
int i = l;
int p1 = l;
int p2 = mid + 1;
//遍歷,移動p1,p2指針,比較兩處索引的值,小的放到輔助數組的對應索引處
while (p1 <= mid && p2 <=h){
if (less(a[p1],a[p2])){
assist[i++] = a[p1++];
}else {
assist[i++] = a[p2++];
}
}
//遍歷數組,如果p1的指針沒有走完,則順序移動p1指針,把對應的元素放到輔助數組的對應索引處
while (p1 <= mid){
assist[i++] = a[p1++];
}
//遍歷數組,如果p2的指針沒有走完,則順序移動p2指針,把對應的元素放到輔助數組的對應索引處
while (p2 <= h){
assist[i++] = a[p2++];
}
//把輔助數組中的元素拷貝到原數組中
for (int j = l; j <= h; j++) {
a[j] = assist[j];
}
}
}public class MergeSortTest {
public static void main(String[] args) {
Integer[] arr = {5,6,3,1,8,7,2,4};
MergeSort.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
//排序前:{5,6,3,1,8,7,2,4}
//排序后:{1,2,3,4,5,6,7,8}
復雜度
- 時間復雜度:O(nlogn)
- 空間復雜度:O(n)
到此這篇關于圖解Java經典算法歸并排序的原理與實現(xiàn)的文章就介紹到這了,更多相關Java歸并排序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot Rabbit MQ topic 配置文件綁定隊列和交換機的
本文詳細講解了在SpringBoot中使用RabbitMQ進行隊列與交換機的綁定方法,包括創(chuàng)建交換機、隊列和綁定它們的步驟,以及如何發(fā)送和接收消息,適用于開發(fā)高并發(fā)系統(tǒng),如秒殺系統(tǒng)等2024-09-09
java算法Leecode刷題統(tǒng)計有序矩陣中的負數
這篇文章主要為大家介紹了java算法Leecode刷題統(tǒng)計有序矩陣中的負數示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

