归并排序:
- 使用分治法思想 : 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
- 使用归并排序最重要的是要使每个合并的部分内的元素都是有序的。
- 将数组从中间分成两部分,再将这两个部分各自分割,直到不能分割,
- 当每个部分都只含有一个元素,而这个元素在自己所在的内部都是有序的,这里使用递归进行分割
- 然后将分割好之后的部分开始进行合并存放到一个临时数组中,再将排好序的临时数组中的元素放入到要返回的数组中
public class MergeSort {
public static void main(String[] args) {
int[] array = new int[]{3,1,8,34,93,1,35,34,7,9,6,5};
System.out.println(Arrays.toString(array));
mergeSort(array, 0, array.length-1);
System.out.println(Arrays.toString(array));
}
//进行分割
public static void mergeSort(int[] array,int begin,int end){
int middle = (begin+end)/2;
if(begin<end){
//处理左边
mergeSort(array, begin, middle);
//处理右边
mergeSort(array, middle+1, end);
//归并
merge(array, begin, middle, end);
}
}
//进行合并
public static void merge(int[] array,int begin,int middle,int end){
//用于存储归并后的临时数组
int[] temp = new int[end-begin+1];
//用于记录第一个数组的下标
int i = begin;
//用于记录第二个数组的下标
int j = middle+1;
//用于记录临时数组中的下标
int index = 0;
//遍历两个数组取消的放入临时数组中
while(i<=middle&&j<=end){
//如果第一个数组中的比第二个数组中的小,把第一个数组中的元素方法临时数组中
if(array[i]<array[j]){
temp[index] = array[i];
i++;
index++;
}else {
temp[index] = array[j];
j++;
index++;
}
}
//当一个数组中的所有元素都存放到了临时数组中,则把另一个数组中剩余的元素直接放入到数组中
while(i<=middle){
temp[index] = array[i];
i++;
index++;
}
while(j<=end){
temp[index] = array[j];
j++;
index++;
}
//所有元素都存放到了临时数组中
for (int k = 0; k < temp.length; k++) {
array[k+begin] = temp[k];
}
System.out.print("array=====");
for (int k : array) {
System.out.print(k+" ");
}
System.out.println();
}
}