java的归并排序算法_归并排序算法Java实现
一. 算法描述
歸并排序采用了分治策略(divide-and-conquer),就是將原問題分解為一些規模較小的相似子問題,然后遞歸解決這些子問題,最后合并其結果作為原問題的解。
歸并排序將待排序數組A[1..n]分成兩個各含n/2個元素的子序列,然后對這個兩個子序列進行遞歸排序,最后將這兩個已排序的子序列進行合并,即得到最終排好序的序列。具體排序過程如下圖所示:
歸并排序中一個很重要的部分是兩個已排序序列合并的過程,這里需要另外開辟一塊新的空間來作為存儲這兩個已排序序列的臨時容器。假設對A[p..r]序列進行合并,已知A[p..q]及A[q+1..r]為已排序的序列,合并的具體步驟為:
Step 1:新建兩個數組L、R分別存儲待合并序列A[p..q]和A[q+1..r],將待排序序列中的對應元素copy到L和R中,L和R最后設置一個極大值作為“哨兵”;
Step 2:令指針i指向L的起始元素,j指向R的起始元素,k指向A待合并部分的起始元素A[p];
Step 3:若L[i]≤R[j],令A[k]=L[i],i=i+1,k=k+1;
否則,令A[k]=R[j],j=j+1,k=k+1;
(這一步即依次比較i、j所指向的元素,將較小值依次放入到A中相應位置。)
Step 4 :重復Step 3,r-p+1次后停止,即依次確定A[p..q]每個位置上的元素。
經過合并操作后,A[p..q]為一個有序序列。若待合并序列為(38, 49, 65, 97, 13, 27, 49, 76),p=1,q=4,, r=8,即A[1..4]和A[5..8]分別為有序序列,則合并操作的具體過程如下圖所示:
package com.neuedu.algorithm;
import java.util.Arrays;
public class MergeSort {
//歸并排序
/*歸并排序采用遞歸實現
* 分階段可以理解為就是遞歸拆分子序列的過程、
* 治階段,我們需要將兩個已經有序的子序列合并成一個有序序列,比如上圖中的最后一次合并,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合并為最終序列[1,2,3,4,5,6,7,8],
* */
public static void main(String []args){
int []arr = {9,8,7,6,5,4,3,2,1};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int []arr){
int []temp = new int[arr.length];//在排序前,先建好一個長度等于原數組長度的臨時數組,避免遞歸中頻繁開辟空間
sort(arr,0,arr.length-1,temp);
}
private static void sort(int[] arr,int left,int right,int []temp){
if(left
int mid = (left+right)/2;
sort(arr,left,mid,temp);//左邊歸并排序,使得左子序列有序
sort(arr,mid+1,right,temp);//右邊歸并排序,使得右子序列有序
merge(arr,left,mid,right,temp);//將兩個有序子數組合并操作
}
}
private static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;//左序列指針
int j = mid+1;//右序列指針
int t = 0;//臨時數組指針
while (i<=mid && j<=right){
if(arr[i]<=arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
}
}
while(i<=mid){//將左邊剩余元素填充進temp中
temp[t++] = arr[i++];
}
while(j<=right){//將右序列剩余元素填充進temp中
temp[t++] = arr[j++];
}
t = 0;
//將temp中的元素全部拷貝到原數組中
while(left <= right){
arr[left++] = temp[t++];
}
}
}
總結
以上是生活随笔為你收集整理的java的归并排序算法_归并排序算法Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理想汽车宣布累计交付超 30 万辆,创新
- 下一篇: QQ电脑上删除聊天记录之后手机上还有吗(