1 归并算法:思想:假设初始序列含有n个记录,进行两两归并,得到长度为不小于n/2的最大整数个两个一组或者一个一组的有序序列 然后再进行二二归并,知道完全有序。
public static void mergingsort(short[] arr,int low,int high){
if(low>=high) return;
else{
int middle=(low+high)/2;
//找到中间索引,进行二路归并
mergingsort(arr, low, middle);
mergingsort(arr, middle+1, high);
merge(arr,low,middle,high);//将两个有序序列合并成一个有序序列
}
}
//实现归并算法
public static void merge(short[] arr,int low,int middle,int high){
//申请一个相同大小的数组 归并算法需要的额外的内存空间与数组的长度成正比
short [] temp=new short[arr.length];
//最理想的情况是 后边数组的首项大于等于前边数组的尾项,可以在这里加一个判断
int i=low;//索引指向前半部分数组
int j=middle+1;//索引指向后半部分数组
int k=0;//记录中间数组的索引
for(;i<=middle&&j<=high;k++){
if(arr[i]<=arr[j]){
temp[k]=arr[i++];//前半数组"指针"后移
}
else{
temp[k]=arr[j++];
}
}
//此时 两个序列中只有一个序列的索引到达最后
if(i<=middle)
while (i <= middle) {
temp[k++] = arr[i++];
}
else
while (j <= high) {
temp[k++] = arr[j++];
}
//此时temp处于有序的状态,将数据返回arr
for(int n=0;n<k;n++){
arr[low+n]=temp[n];//因为递归过程中 数组的起始位置是low 是一个可变的值
}
}