归并排序(Merge Sort)
算法描述:
- 把长度为n的输入序列分成两个长度为n/2的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
代码实现:
/**
* @author 12779
* 归并排序
*/
public class MergeSort {
/**
* 调用归并排序
*/
public static void mergeSort(int[] data) {
sort(data, 0, data.length - 1);
}
/**
*
* @param data 要排序的数组
* @param l 左边位置
* @param r 右边位置
*/
private static void sort(int[] data, int l, int r) {
//l==r,最小分,不在继续下分
if (l==r){
return;
}
//找到要分的中间节点
int mid = l + ((r - l) >> 1);
//左边部分继续下分
sort(data, l, mid);
//右边部分继续下分
sort(data, mid + 1, r);
//合并分好的两边数组
merge(data, l, mid, r);
}
public static void merge(int[] arr, int l, int mid, int r) {
int[] temp = new int[r - l + 1];
int i = 0;
int p1 = l;
int p2 = mid + 1;
// 比较左右两部分的元素,哪个小,把那个元素填入temp中
while(p1 <= mid && p2 <= r){
temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
// 上面的循环退出后,把剩余的元素依次填入到temp中
// 以下两个while只有一个会执行
while(p1 <= mid){
temp[i++] = arr[p1++];
}
while(p2 <= r){
temp[i++] = arr[p2++];
}
// 把最终的排序的结果复制给原数组
for(i = 0; i < temp.length; i++){
arr[l + i] = temp[i];
}
}
public static void main(String[] args) {
//定义要排序的数组
int[] data={4152,485,132,4856,12348,1523};
System.out.println("排序前:"+ Arrays.toString(data));
//调用函数排序
mergeSort(data);
System.out.println("排序后:"+ Arrays.toString(data));
}
}
结果:
排序前:[4152, 485, 132, 4856, 12348, 1523]
排序后:[132, 485, 1523, 4152, 4856, 12348]