java归并排序
-
java排序算法的一种,时间复杂度为nlog2n。效率较高。
-
1.数据分割阶段。将数据分成两份,之后递归再分成两份,直到每份只有一个数据,如下图:

-
2.治理数据阶段。将每一组排序的数据按照一个规则排序,存放在临时数组temp中
下图按照最后一步治理数据为例,起始分开之后的每一步数据治理都可使用这套规则。所以可以分装好,放入排序方法中,等待递归。
- 具体代码实现
package sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class MergeSort {
public static void main(String[] args) {
// int[] arr = {-8,422,42,6,-12,90};
// System.out.println(Arrays.toString(arr));
// mergeSort(arr, 0, arr.length-1,temp);
// System.out.println(Arrays.toString(arr));
int[] arr = new int[800000];
for (int i = 0; i < arr.length; i++) {
arr[i] =(int)(Math.random()*8000);
}
int[] temp =new int[arr.length];
Date date1 = new Date();
SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String dateString1 = simpleDateFormat.format(date1);
System.out.println(dateString1);
mergeSort(arr, 0, arr.length-1,temp);
Date date2 = new Date();
String dateString2 = simpleDateFormat.format(date2);
System.out.println(dateString2);
}
/**
*
* @param a 数组
* @param left 左坐标
* @param right 又坐标
* @param temp 临时数组
*/
public static void mergeSort(int[] a,int left ,int right,int[] temp) {
if(left<right) {
int midIndex = (left+right)/2;
//向左递归分解
mergeSort(a, left, midIndex, temp);
//向右递归分解
mergeSort(a, midIndex+1, right, temp);
merge(a, left, midIndex, right, temp);
}
}
//封装好的治理归并函数,适用于每一层递归
public static void merge(int[] a,int left ,int mid,int right,int[] temp) {
//1.将某一边的数据排列进入temp
int i = left;
int j = mid +1;
int t= 0;
while(i<= mid && j<=right) {
if(a[j]<=a[i]) {
temp[t] = a[j];
t+=1;
j++;
}else {
temp[t] = a[i];
t++;
i++;
}
}
//2将另一边的剩余的数据全部加入temp中
while(i<=mid) {
temp[t] = a[i];
t++;
i++;
}
while(j<=right) {
temp[t] = a[j];
t++;
j++;
}
//2将在temp中排序号的数据复制到a数组中
int tempLeft = left;
t= 0;//从头开始
while(tempLeft <= right) {
a[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
}
在随机生成的80000个数据,使用时间
2019-08-13 11:57:14 971
2019-08-13 11:57:15 202
使用了231ms


2万+

被折叠的 条评论
为什么被折叠?



