摘自 http://www.vogella.com/articles/JavaAlgorithmsMergesort/article.html
这个对本人实在是很有难度。。
起初是在java的Collections.sort()的api里面看到, 说是java所使用的排序是修改了的mergesort .- The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element in the low sublist is less than the lowest element in the high sublist).
网上查了一下就看到这个。
拿着纸和比在
debug模式里
研究了半天,大概明白了那么一点点。
实现代码:
class="java">public class Mergesort
{
private int[] numbers;
/**
* int[] helper在算法中起到存放数据并和numbers里进行大小比较的作用。
*/
private int[] helper;
/**
* number是要排序的数组的大小
*/
private int number;
public void sort(int[] values){
this.numbers=values;
number=values.length;
this.helper=new int[number];
mergesort(0,number-1);
}
private void mergesort(int low, int high){
//check if low is smaller than high, if not
//then the array is sorted.
if(low<high){
//get the index of the element which is in the middle
int middle=low+(high-low)/2;
//sort the left side of the array
mergesort(low,middle);
//sort the right side of the array
mergesort(middle+1, high);
//combine them both
merge(low,middle,high);
}
}
private void merge(int low, int middle, int high){
//copy both parts into the helper array
for(int i=low; i<=high; i++){
helper[i]=numbers[i];
}
int i=low;
int j=middle+1;
int k=low;
//copy the smallest values from either the left or the right
//side back to the original array
while(i<=middle&&j<=high){
//这里进行排序,如果helper[i]和helper[j]根据大小进行位置调整
//比如helper[0]==3和helper[1]==1,则进入if里面
//number[1]=helper[0]
if(helper[i]<=helper[j]){
numbers[k]=helper[i];
i++;
}else{
numbers[k]=helper[j];
j++;
}
//k代表numbers的索引,是一定会加1的。因为这里就是要将helper[i]
//和helper[j]做比较。最终将小的那个值放入numbers[k]
k++;
}
//copy the rest of the left side of the array into the target array
while(i<=middle){
//完成刚才排序的位置调整
numbers[k]=helper[i];
k++;
i++;
}
}
}
测试代码:
public class Test01
{
public static void main(String[] args)
{
int[] numbers={3,1,2,6,7,3,4};
Mergesort sorter=new Mergesort();
sorter.sort(numbers);
for(int i:numbers){
System.out.println(i);
}
//1 2 3 3 4 6 7
}
}
jdk的各种算法包括binary search,mergesort都在Arrays类里面。
都是加入了
泛型的。
都是sun公司的
高手写的。 想提高的话可以去研究研究。。