归并排序
归并排序
归并排序的大致思想就是:先把数据划分成若干个有序的数组,把两个有序的数组和合并成一个数组,直到合并成一个数组.
所以实现过程就分为两个部分:
- 把一个乱序的数组划分成若干个有序的数组.(这个很简单,每个数组里都只有一个数,不就是有序的吗?)
- 把这些数组不断合并直到合并成一个有序的数组
划分成若干个有序数组的实现
/**
* @param data 存储数据的数组
* @param begin 划分的开始位置
* @param end 划分的结束位置
* 表述均是[begin,end)左闭右开
*/
public static void sort(int[] data, int begin, int end) {
int mid = (begin + end) / 2;
if (mid > begin) {
sort(data, begin, mid);
sort(data, mid, end);
}
merge(data, begin, mid, mid, end);//合并数组
}
合并数组的实现
/**
* @param data 存储数据的数组
* @param b1 第一个数组的开始位置
* @param e1 第一个数组的结束位置
* @param b2 第二个数组的开始位置
* @param e2 第二个数组的结束位置
* 两个数组的开始结束位置的表述均是[begin,end)左闭右开
*/
private static void merge(int[] data, int b1, int e1, int b2, int e2) {
ArrayList<Integer> list = new ArrayList<>();//追求性能不应该用list的,声明一个e2-b1大小的数组代替掉这个就可以.
//合并两个有序数组,这个过程很好实现,不多说了
for (int i = b1, j = b2; i < e1 || j < e2; ) {
if (i == e1) {
list.add(data[j]);
j++;
} else if (j == e2) {
list.add(data[i]);
i++;
} else if (data[i] <= data[j]) {
list.add(data[i]);
i++;
} else if (data[i] > data[j]) {
list.add(data[j]);
j++;
}
}
//把合并的后的有序数组,写到data数组中
int j = 0;
for (int i = b1; i < e2; i++) {
data[i] = list.get(j);
j++;
}
}
示例
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class MergeSort {
public static void sort(int[] data, int begin, int end) {
int mid = (begin + end) / 2;
if (mid > begin) {
sort(data, begin, mid);
sort(data, mid, end);
}
merge(data, begin, mid, mid, end);
}
private static void merge(int[] data, int b1, int e1, int b2, int e2) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = b1, j = b2; i < e1 || j < e2; ) {
if (i == e1) {
list.add(data[j]);
j++;
} else if (j == e2) {
list.add(data[i]);
i++;
} else if (data[i] <= data[j]) {
list.add(data[i]);
i++;
} else if (data[i] > data[j]) {
list.add(data[j]);
j++;
}
}
int j = 0;
for (int i = b1; i < e2; i++) {
data[i] = list.get(j);
j++;
}
}
public static void main(String[] args) {
int []data=new int[100];
Random random=new Random();
for (int i = 0; i <data.length ; i++) {
data[i]=random.nextInt(Integer.MAX_VALUE);
}
System.out.println(Arrays.toString(data));
sort(data,0,data.length);
System.out.println(Arrays.toString(data));
}
}

浙公网安备 33010602011771号