归并排序
归并排序的思想:将待排序序列分为两部分,对每部分递归的应用归并排序,在两部分都排好序后进行合并。
代码:
public class Solution {
/*
* 归并排序
*/
static void funMergerSort(int[] array) {
if (array.length > 1) {
//先对数组的一半进行处理
int length1 = array.length / 2;
int[] array1 = new int[length1];
System.arraycopy(array, 0, array1, 0, length1);
funMergerSort(array1);
//对另一半进行处理
int length2 = array.length - length1;
int[] array2 = new int[length2];
System.arraycopy(array, length1, array2, 0, length2);
funMergerSort(array2);
//对两个数组进行合并处理
int[] datas = merge(array1, array2);
System.arraycopy(datas, 0, array, 0, array.length);
}
}
//合併兩個數組(在合并的时候已经进行一个比较排序了)
static int[] merge(int[] list1, int[] list2) {
int[] list3 = new int[list1.length + list2.length];
int count1 = 0;
int count2 = 0;
int count3 = 0;
//進行合併
while (count1 < list1.length && count2 < list2.length) {
if(list1[count1] < list2[count2]) {
list3[count3++] = list1[count1++];
}
else {
list3[count3++] = list2[count2++];
}
}
while (count1 < list1.length) {
list3[count3++] = list1[count1++];
}
while (count2 < list2.length) {
list3[count3++] = list2[count2++];
}
return list3;
}
public static void main(String[] args) {
int[] nums = new int[]{3,2,8,6,7,9,1,5};
funMergerSort(nums);
for(int i : nums) {
System.out.print(i + " ");
}
}
}
归并排序的时间复杂度:O(nlogn),空间复杂度:O(n)