package test;
import java.util.List;
public class Merge_sort {
public void sort(int[]a,int n){
int l = 0;
int r = a.length-1; //list中的元素个数
//归并
devide(a,l,r);
}
/**
* 归:分治
*/
private void devide(int[] a,int left,int right){
//归
int mid = (left+right)/2;
if (left < right){
devide(a,left,mid);
devide(a,mid+1,right);
//并
merge(a,left,mid,mid+1,right);
}
// else {
// //并
// merge(list,left,mid,mid+1,right);
// }
}
/**
* 并
*
* @param left
* @param mid
* @param i
* @param right
*/
private void merge(int[] a, int left, int mid, int i, int right) {
int[] temp =new int[a.length];
int index = left; //temp数组的起始索引
int ls = left,le = mid; //ls 左边的起始索引,le左边的结束索引
int rs = i, re = right; //rs 右边的起始索引,re 右边的结束索引
//至少把一边的数组元素排好,放入临时数组
while (ls <= le && rs <= re){
// Comparable o1 = (Comparable) list.get(ls);
// Comparable o2 = (Comparable) list.get(rs);
if (a[ls] < a[rs]){
//表示o1 < o2
temp[index] = a[ls];
ls++;
}
else {
temp[index] = a[rs];
rs++;
}
index++;
}
//判断左边元素是否有剩余
if (ls <= le){
for (int j = ls; j<=le; j++)
{
temp[index++] = a[j];
}
}
//判断右边元素是否有剩余
if (rs <= re){
for (int j = rs; j<=re; j++)
{
temp[index++] = a[j];
}
}
for (int j=left; j<=right; j++)
{
a[j] = temp[j];
}
}
}
//测试
public void test4(){
int[] b = {4,5,9,3,90,47};
Merge_sort c = new Merge_sort();
c.sort(b,b.length-1);
for (int i=0; i<b.length; i++)
{
System.out.print(b[i]+" ");
}
}
归并排序 -- 非接口实现
于 2019-06-11 22:59:59 首次发布