码迷,mamicode.com
首页 > 编程语言 > 详细

学习归并排序

时间:2016-10-24 20:40:19      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:int   alt   网上   复杂度   copy   需要   时间   java   str   

  归并排序,也是基于分治的思想,把一个数组不断切分,直到分到尾一个元素,然后两两合并,由于从一个元素开始的,所以这样每个合并的数组都是有序的, 合并只需要常数的时间完成,所以它的时间递推式为 :T(n) = 2T(n/2) + O(n), 前一项是分为两个子数组的时间复杂度,后面一项是合并两个排序好的数组的时间复杂度是O(n),

  它的运行过程,在这里在网上找了一个图,很清晰的说明了这个过程:    

技术分享

下面是java的归并排序的demo:

  

public static  void  mergeSort(int[] a, int start, int end){

int[] sorted = new int[a.length];
if(start < end){
int mid = (start + end)/2;

mergeSort(a,start,mid);
mergeSort(a,mid+1,end);
merge(a,start,mid,end,sorted);
}
}

public static void merge(int[] a, int left, int mid, int right,int[] sorted){

int i = left;
int k = left;
int j= mid+1;

while(i <= mid && j <= right){
if(a[i] < a[j]){
sorted[k++] = a[i++];
}else{
sorted[k++] = a[j++];
}
}

//copy后半部分
while(i <= mid){
sorted[k++] = a[i++];
}

while(j <= right){
sorted[k++] = a[j++];
}

//拷贝正确的位置
for(int q = left; q <= right; q++){
a[q] = sorted[q];
}
}

public static void main(String[] args) {

int[] a = {1,4,5,32,3,44};

mergeSort(a,0,a.length-1);

for(int e : a){
System.out.print(e + " ");
}
}

 

学习归并排序

标签:int   alt   网上   复杂度   copy   需要   时间   java   str   

原文地址:http://www.cnblogs.com/xjz1842/p/5994098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!