上动图:
所有元素不断地拆成两份,拆到最小的只剩两个,然后就进行排序,不断往上排序复合。
分治法和递归思想。
这玩意好像有点难理解。。。。
//归并排序,递归和合并
public static <E extends Comparable<E>> void sort(E[] data,int l,int r){
if (l>=r)return ;//求解最基本问题
int mid=(l+r)/2;
//对data[l,mid]进行
sort(data,l,mid);//递归分解
//对dat(mid,r]进行 //把原问题转换成小问题
sort(data,mid+1,r);//递归分解
//合并数组 将两个有序的数组合成一个数组
//将data[l...mid]和data[mid+1...r]合并
merge(data,l,mid,r); //如何合并?
}
public static <E extends Comparable<E>> void merge(E[] data,int l,int mid, int r){
E[] temp= Arrays.copyOfRange(data,l,r+1);//复制一个数组 data和temp数组元素对应位置偏移l个位置
int i=l,j=mid+1;
for (int k=l;k<=r;k++){
//data[i]和data[j]对比
if (i>mid){//i左边的元素放完了,i越界
data[k]=temp[j-l];//剩下的j到r是有序的,就可以直接放进去原数组中了
j++;
}else if (j>r){//j右边的元素放完了,j越界了
data[k]=temp[i-l];
i++;
}else if (temp[i-l].compareTo(temp[j-l])<=0){//对比两边的数组,小的在左边,i不断地右移动,继续对比
data[k]=temp[i-l];
i++;
}else {
//if (temp[i-l].compareTo(temp[j-l])>=0)//对比两边的数组,小的在右边,j不断地右移动,继续对比
data[k]=temp[j-l];
j++;
}
}
};
public static void main(String[] args){
Integer[] data={16,8,30,9,2,678,0,2,4,0,1};
sort(data,0,data.length-1);
for (int i=0;i<data.length;i++){
System.out.print(" "+data[i]);
}
System.out.println();
}
说些屁话:键盘鼠标真好用,声音嘎嘎脆,真香,越来越爱电子产品了。