java基础之归并排序

java中的Arrays.sort(Object[] o)是对数组进行排序,它使用的是归并排序的方式, 
快速排序要比归并排序更快一些,但为什么使用归并排序了?原因是归并排序是一种稳定的排序 
方式,即归并排序不交换相同的元素,这就意味着,在按一种方式排序后同时可以按另外一种 
方式进行排序。比如员工可以首先按工资排序,然后按名字排序,一种排序不会打乱另一种排序 

的顺序。

具体示例代码如下:

import java.util.*;
//归并排序
public class dayOf26_35 {
private double[] bridge;//辅助数组
public void sort(double[] obj){
if (obj == null){
throw new NullPointerException("The param can not be null!");
}
bridge = new double[obj.length]; // 初始化中间数组
mergeSort(obj, 0, obj.length - 1); // 归并排序
bridge = null;
}
//递归
private void mergeSort(double[] obj, int left, int right){
if (left < right){
int center = (left + right) / 2;
mergeSort(obj, left, center);
mergeSort(obj, center + 1, right);
merge(obj, left, center, right);
}
}
private void merge(double[] obj, int left, 
int center, int right){
int mid = center + 1;
int third = left;
int tmp = left;
while (left <= center && mid <= right){ 
// 从两个数组中取出小的放入中间数组
if (obj[left]-obj[mid]<=10e-6){
bridge[third++] = obj[left++];
} else{
bridge[third++] = obj[mid++];
}
}


// 剩余部分依次置入中间数组
while (mid <= right){
bridge[third++] = obj[mid++];
}
while (left <= center){
bridge[third++] = obj[left++];
}
// 将中间数组的内容拷贝回原数组
copy(obj, tmp, right);
}
private void copy(double[] obj, int left, int right)
{
while (left <= right){
obj[left] = bridge[left];
left++;
}
}
public static void main(String[] args) {
Random random = new Random();


int arraysize = 10;
double[] sorted = new double[arraysize];
System.out.print("Before Sort:");
for (int j = 0; j < arraysize; j++) {
sorted[j] = (int) (random.nextDouble() * 100);
System.out.print((int) sorted[j] + " ");
}
System.out.println();


dayOf26_35 sorter = new dayOf26_35();

sorter.sort(sorted);

System.out.print("归并排序后:");
for (int j = 0; j < sorted.length; j++) {
System.out.print((int) sorted[j] + " ");
}
System.out.println();
}


}

你可能感兴趣的:(java,object,null,Random,import,merge)