什么是歸并排序呢,歸并排序就是先分再合,所謂先分再合就是先分到不能再分,也就是每組一個(gè)元素,再原來(lái)的兩組合并成一組,在合并途中,進(jìn)行比較來(lái)排序,形成有序數(shù)組,以此類推就可以得出最后一個(gè)有序的數(shù)組。
如何合并:
用l(left)表示左數(shù)組的第一個(gè)元素,
m(middle)表示左數(shù)組的最后一個(gè)元素,
r(right)代表右數(shù)組最后一個(gè)元素,
m+1代表右數(shù)組第一個(gè)元素。
k表示新數(shù)組的最后一個(gè)元素后面一個(gè)位置。
左數(shù)組的第一個(gè)元素和右數(shù)組進(jìn)行比較,最小的放在第k個(gè)位置上,k++,如果左數(shù)組小則i++,右數(shù)組小則j++,直到一方比完,另一方的所有剩余元素賦值到k的位置。
先創(chuàng)建一個(gè)與原數(shù)組等大的數(shù)組,將數(shù)組進(jìn)行深拷貝得到兩個(gè)相同的數(shù)組。
遞歸調(diào)用兩個(gè)函數(shù),一個(gè)分函數(shù),一個(gè)合并函數(shù)。
package bobo.algo;
import java.util.*;
public class MergeSort{
// 我們的算法類不允許產(chǎn)生任何實(shí)例
? ? private MergeSort(){}
// 將arr[l...mid]和arr[mid+1...r]兩部分進(jìn)行歸并
? ? private static void merge(Comparable[] arr, int l, int mid, int r) {
Comparable[] aux = Arrays.copyOfRange(arr, l, r+1);
? ? ? ? // 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1
? ? ? ? int i = l, j = mid+1;
? ? ? ? for(int k = l; k <= r; k ++ ){
if( i > mid ){// 如果左半部分元素已經(jīng)全部處理完畢
? ? ? ? ? ? ? ? arr[k] = aux[j-l]; j ++;
? ? ? ? ? ? }
else if( j > r ){// 如果右半部分元素已經(jīng)全部處理完畢
? ? ? ? ? ? ? ? arr[k] = aux[i-l]; i ++;
? ? ? ? ? ? }
else if( aux[i-l].compareTo(aux[j-l]) <0 ){// 左半部分所指元素 < 右半部分所指元素
? ? ? ? ? ? ? ? arr[k] = aux[i-l]; i ++;
? ? ? ? ? ? }
else{// 左半部分所指元素 >= 右半部分所指元素
? ? ? ? ? ? ? ? arr[k] = aux[j-l]; j ++;
? ? ? ? ? ? }
}
}
// 遞歸使用歸并排序,對(duì)arr[l...r]的范圍進(jìn)行排序
? ? private static void sort(Comparable[] arr, int l, int r) {
if (l >= r)
return;
? ? ? ? int mid = (l+r)/2;
? ? ? ? sort(arr, l, mid);
? ? ? ? sort(arr, mid +1, r);
if(array[i]>array[i+1])
? ? ? ? merge(arr, l, mid, r);
? ? }
public static void sort(Comparable[] arr){
int n = arr.length;
? ? ? ? sort(arr, 0, n-1);
? ? }
插入排序在數(shù)量較小時(shí)比歸并排序快
所以當(dāng)少于15個(gè)數(shù)時(shí)可以用插入法,大于15可以用歸并算法