简述:
java实现归并排序
知识点:
1. 归并排序算法
2. Compare 接口实现
3. Java随机数
代码:
Comapre接口,
CompareTwoObject.java
package sort.algorithm;
public interface CompareTwoObject {
boolean Compare(Object a, Object b);
}
归并排序,及测试函数,
MergeSortAlgorithm.java
package sort.algorithm;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MergeSortAlgorithm {
//匿名内部类
//使用Strategy模式 , 根据Object的不同决定不同的比较方法
CompareTwoObject compareTwoObject = new CompareTwoObject(){
@Override
public boolean Compare(Object a, Object b) {
if(a instanceof Integer && b instanceof Integer){
Integer x = (Integer)a;
Integer y = (Integer)b;
if(x > y)
return true;
}
return false;
}
};
private List list = new ArrayList();
public MergeSortAlgorithm(List list){
this.list = list;
}
private void Swap(int pos1, int pos2){
Integer temp = list.get(pos2);
list.set(pos2, list.get(pos1));
list.set(pos1, temp);
}
private void MergeSort(int start, int end){
//only two object compared
if(end - start == 1){
if(compareTwoObject.Compare(list.get(start), list.get(end))){
Swap(start, end);
}
}else if(start != end){
int middle = (start + end) / 2;
MergeSort(start, middle - 1);
MergeSort(middle, end);
Merge(start, end);
}
}
private void Merge(int start, int end){
int middle = (start + end) / 2;
int index1 = start;
int index2 = middle;
Integer[] tempArray = new Integer[end - start + 1];
int index = 0;
while(index1 < middle && index2 <= end){
if(compareTwoObject.Compare(list.get(index1), list.get(index2))){
tempArray[index++] = list.get(index2++);
}else{
tempArray[index++] = list.get(index1++);
}
}
//collect the remaining elements to tempArray
if(index1 != middle){
for(int i = index1; i < middle; i++){
tempArray[index++] = list.get(i);
}
}else{
for(int i = index2; i <= end; i++){
tempArray[index++] = list.get(i);
}
}
//copy from tempArray to list[start,end]
for(int i = 0; i < end - start + 1; i++){
list.set(start + i, tempArray[i]);
}
}
public List getSortedList(){
MergeSort(0, list.size() - 1);
return list;
}
public static void main(String[] args){
List list = new ArrayList();
//produce raw data to a list
System.out.println("Raw Input: ");
for(int i = 0;i < 10;i++){
Random random = new Random();
Integer x = random.nextInt(100);
System.out.print(x + " ");
list.add(x);
}
//intialize MergeSortAlgorithm class
MergeSortAlgorithm mergeSortAlgorithm = new MergeSortAlgorithm(list);
System.out.println("\nSorted Integer List Output: ");
for(Integer i : mergeSortAlgorithm.getSortedList())
System.out.print(i + ", ");
}
}
输出: