归并排序
思路
1、尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素是1为止。
2、将相邻的两个子组进行合并成一个有序的大组。
3、不断的重复步骤2,直到最终只有一个组为止。
·········· 图片上面为分,下面为合
流程
数字代表顺序
代码
public class MergeSort {
public static void main(String[] args) {
int[] value = {8, 4, 5, 7, 1, 3, 6, 2};
new MergeSort().sort(value);
for (int item : value) {
System.out.print(item + ",");
}
}
public void sort(int[] value){
int left = 0;
int right = value.length - 1;
int[] temp = new int[value.length];
this.mergeSort(value, left, right, temp);
}
//分+合
public void mergeSort(int[] value, int left, int right, int[] temp){
if (left < right){
int mid = (left + right) / 2;
mergeSort(value, left, mid, temp); //------>向左分
mergeSort(value, mid + 1, right, temp); //------>向右分
merge(value, left, mid, right, temp); //------>调用合并的方法
}
}
//合并
public void merge(int[] value, int left, int mid, int right, int[] temp){
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right){
if (value[i] <= value[j]){
temp[t] = value[i];
t = t + 1;
i = i + 1;
} else {
temp[t] = value[j];
t += 1;
j += 1;
}
}
while( i <= mid) {
temp[t] = value[i];
t += 1;
i += 1;
}
while( j <= right) {
temp[t] = value[j];
t += 1;
j += 1;
}
t = 0;
int tempLeft = left;
while(tempLeft <= right) {
value[tempLeft] = temp[t];
t += 1;
tempLeft += 1;
}
}
}