/**
* 归并排序,分治思想的一种体现
* 事件复杂度:最好最坏都是O(nlogn),辅助空间是O(n)
* @author Feng
*
*/
public class MergeSorting {
public static void sort(int[] src,int start,int end){
if(start==end){
return;
}else{
int middle = (start+end)/2;
sort(src,start,middle);
sort(src,middle+1,end);
merge(src,start,middle,middle+1,end);
}
}
/**
* 区间[s1,e1],[s2,e2]已经排好序了,而且[s1,e2]是一段连续的空间
* @param src
* @param s1
* @param e1
* @param s2
* @param e2
*/
public static void merge(int[] src, int s1, int e1, int s2, int e2) {
int[] temp = new int[e2-s1+1];
int ts1=s1,ts2=s2;//用来标记两个区间处理到哪一位置了
for (int i = s1; i <=e2; i++) {
if(ts1>e1){//说明第一段区间已经处理完
temp[i-s1]=src[ts2++];
continue;
}
if(ts2>e2){
temp[i-s1]=src[ts1++];
continue;
}
if(src[ts1]<=src[ts2]){
temp[i-s1]=src[ts1++];
}else{
temp[i-s1]=src[ts2++];
}
}
for (int i = s1; i <=e2; i++) {//赋值给原区间
src[i]=temp[i-s1];
}
}
public static void main(String[] args) {
int[] src = new int[]{5,2,8,3,5,0};
sort(src,0,src.length-1);
for (int i : src) {
System.out.println(i);
}
}
}
算法复习之归并排序
最新推荐文章于 2024-06-05 15:45:51 发布