归并排序算法

来源:互联网 发布:app运营数据报告模板 编辑:程序博客网 时间:2024/06/06 23:51

算法伪代码:

Merge-Sort(A,p,r){

//输入无序数组A[p...r],输出有序数组A[p...r]

if p < r 

then q <- (p + r) / 2

Merge-Sort(A,p,q)

Merge-Sort(A,q+1,r)

Merge(A,p,q,r)

}

Merge(A,p,q,r){

n1 <- q-p+1

n2 <- r-q

create array L[1...n1+1] and R[1...n2+1]

L[1...n1] <- A[p...q]

R[1...n2] <- A[q+1...r]

L[n1+1] <- MAX_AVLUE

R[n2+1] <- MAX_VALUE

i <- 1

j <- 1

for k <- p to r

do if L[i] <= R[j]

then A[k] = L[i]

i <- i+1

else A[k] = R[j]

j <- j+1

}


java实现:

public class TestMergeSort{public static void main(String[] args){System.out.println("Before Mergesort: ");int[] intArray = new int[100];for(int i = 0;i < 100;i++){intArray[i] = (int)(Math.random() * 100);System.out.print(intArray[i] + " ");}mergeSort(intArray,0,intArray.length - 1);System.out.println("\nAfter Mergesort: ");for(int i = 0;i < intArray.length;i++){System.out.print(intArray[i] + " ");}}public static void mergeSort(int[] A,int p,int r){//递归划分至只含一个元素,然后进行合并if(p < r){int q = (p + r) / 2;mergeSort(A,p,q);mergeSort(A,q+1,r);merge(A,p,q,r);}}//合并分别已经排好序的A[p...q]和A[q+1...r]public static void merge(int[] A,int p,int q,int r){int n1 = q - p + 1;int n2 = r - q;//新建两个副本数组L、R分别用于拷贝A[p...q]和A[q+1...r]int[] L = new int[n1 + 1];int[] R = new int[n2 + 1];int i,j;for(i = 0;i < L.length - 1;i++)L[i] = A[p + i];for(j = 0;j < R.length - 1;j++)R[j] = A[q + 1 + j];//将数组L、R的最后一个值设为无穷大作为哨兵L[n1] = Integer.MAX_VALUE;R[n2] = Integer.MAX_VALUE;//从左至右分别比较数组L、R,并将较小值依次放回A[p...r]中i = 0;j = 0;for(int k = p;k <= r;k++){if(L[i] <= R[j])A[k] = L[i++];else A[k] = R[j++];}}}

时间复杂度:

合并的时间复杂度为O(n),划分的时间复杂度为O(logn),故总的时间复杂度为O(nlogn)


空间复杂度:

合并是需要n个额外的临时存储空间来保存合并序列,故空间复杂度为O(n)


稳定性:

稳定

运行结果:


原创粉丝点击