package com.lsd.sort;
/**
* 归并排序
* @author LSD
*
*/
public class MergeSort {
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
mergeSort(data);
System.out.println("排序后的数组:");
print(data);
}
public static void mergeSort(int[] data) {
sort(data, 0, data.length - 1);
}
public static void sort(int[] data, int left, int right) {
if (left >= right)
return;
// 找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(data, left, center);
// 对右边数组进行递归
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
print(data);
}
/**
* 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
*
* @param data
* 数组对象
* @param left
* 左数组的第一个元素的索引
* @param center
* 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
* @param right
* 右数组最后一个元素的索引
*/
public static void merge(int[] data, int left, int center, int right) {
// 临时数组
int[] tmpArr = new int[data.length];
// 右数组第一个元素索引
int mid = center + 1;
// third 记录临时数组的索引
int id = left;
//将data数组赋值一份
for(int k = left; k <= right; k++ ) {
tmpArr[k] = data[k];
}
//关键算法
for(int i = left; i <= right; i++ ){
//左半边用尽,用右边
if(left > center){
data[i] = tmpArr[mid++];
}
//右边用尽用左边
else if(mid > right){
data[i] = tmpArr[left++];
}
//右边边的当前位置少于左半边的当前位置时取右半边
else if(tmpArr[mid] < tmpArr[left]){
data[i] = tmpArr[mid++];
}
//左边边的当前位置少于右半边的当前位置时取左半边
else{
data[i] = tmpArr[left++];
}
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
/**
* 归并排序
* @author LSD
*
*/
public class MergeSort {
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
mergeSort(data);
System.out.println("排序后的数组:");
print(data);
}
public static void mergeSort(int[] data) {
sort(data, 0, data.length - 1);
}
public static void sort(int[] data, int left, int right) {
if (left >= right)
return;
// 找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(data, left, center);
// 对右边数组进行递归
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
print(data);
}
/**
* 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
*
* @param data
* 数组对象
* @param left
* 左数组的第一个元素的索引
* @param center
* 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
* @param right
* 右数组最后一个元素的索引
*/
public static void merge(int[] data, int left, int center, int right) {
// 临时数组
int[] tmpArr = new int[data.length];
// 右数组第一个元素索引
int mid = center + 1;
// third 记录临时数组的索引
int id = left;
//将data数组赋值一份
for(int k = left; k <= right; k++ ) {
tmpArr[k] = data[k];
}
//关键算法
for(int i = left; i <= right; i++ ){
//左半边用尽,用右边
if(left > center){
data[i] = tmpArr[mid++];
}
//右边用尽用左边
else if(mid > right){
data[i] = tmpArr[left++];
}
//右边边的当前位置少于左半边的当前位置时取右半边
else if(tmpArr[mid] < tmpArr[left]){
data[i] = tmpArr[mid++];
}
//左边边的当前位置少于右半边的当前位置时取左半边
else{
data[i] = tmpArr[left++];
}
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}