归并排序
/* 归并排序:将一个数组切分、切分,,,分到不可再分,然后两两合并,,,合并直到合并会大数组
* 合并的过程即合并俩个有序序列。
* 归并排序与快速排序的不同指出在于,快排的有序发生在切分过程,归并的有序发生在合并的过程。
*
* */
public class MergeSort {
public static void main(String[] args) {
int[] array = {5,8,10,12,7,13,15};
MergeSort sort = new MergeSort();
sort.mergeSort(array, 0,array.length-1);
for (int i : array) {
System.out.print(i+" ");
}
}
/* 归并函数,实现有序顺序表合并,两个有序表存放在一个数组中,
* 两个顺序表为array[left,min],array[mid+1,right]
* 声明一个暂存数组tempArray,比较arr[left]、arr[right]
* 将较小的存入tempArray,直到left的下标大于mid或mid+1的下标大于right
* 证明一个数组已全部进入tempArray而另一个数组还没有,将剩下的元素全部放入tempArray
* 最后将tempArray中的元素再全部放回array
* */
public void merge(int[] array,int left,int mid,int right) {
//左子数组的游标
int left_p=left;
//右子数组的游标
int right_p=mid+1;
//暂存数组
int[] tempArray = new int[right-left+1];
//暂存数组的游标
int cur = 0;
//迭代将两子数组中较小的数依次放入tempArray
while(left_p<=mid&&right_p<=right) {
if(array[left_p]<array[right_p]) {
tempArray[cur] = array[left_p];
cur++;
left_p++;
}else {
tempArray[cur] = array[right_p];
cur++;
right_p++;
}
}
//将左子数组中的剩余元素全部放入暂存数组
while(left_p<=mid) {
tempArray[cur] = array[left_p];
cur++;
left_p++;
}
//将右子数组中的剩余元素全部放入暂存数组
while(right_p<=right) {
tempArray[cur] = array[right_p];
cur++;
right_p++;
}
//将暂存数组中的元素全部放回array
int p = left;
cur = 0;
while(cur<tempArray.length) {
array[p] = tempArray[cur];
p++;
cur++;
}
}
public void mergeSort(int[] array,int left,int right) {
/* 递归切分数组
* */
if(left<right) {
int mid = (left+right)/2;
mergeSort(array, left, mid);
mergeSort(array, mid+1,right);
merge(array, left, mid, right);
}
}
}