package sort_1;
public class MergeSort1 {
//利用归并排序算法
public static void mergeSort(DataWrap[] data)
{
sort(data,0,data.length-1);
}
/**
*
* @param data 待排序的数组
* @param left 待排序的数组的第一个元素
* @param right 待排序数组的最后一个元素
*/
private static void sort(DataWrap[] data, int left, int right)
{
if(left < right)
{
int center = (left+right)/2;
sort(data,left,center);
sort(data,center+1,right);
merge(data,left,center,right);
}
}
/**
* 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序
* @param data 数组对象
* @param left 左数组元素的第一个元素的索引
* @param center center是左数组元素的最后一个索引,center+1是右数组元素的第一个元素的索引
* @param right 右数组的最后一个索引
*/
private static void merge(DataWrap[] data,int left, int center, int right)
{
DataWrap[] tempArr = new DataWrap[data.length];
int mid = center +1 ;
int third = left;//third 记录中间数组的索引
int temp = left;
while(left<=center&&mid<=right)
{
if(data[left].compareTo(data[mid])<=0)
{
tempArr[third++] = data[left++];
}
else
{
tempArr[third++] = data[mid++];
}
}
//剩余部分依次放入中间数组
while(mid<=right)
tempArr[third++] = data[mid++];
while(left<=center)
tempArr[third++] = data[left++];
//将中间数组中的内容复制拷回原数组中
//(原left~right范围的内容被复制回原数组)
while(temp<=right)
data[temp] = tempArr[temp++];
}
public static void main(String[] args)
{
DataWrap[] data = new DataWrap[]{
new DataWrap(2,""),
new DataWrap(5,""),
new DataWrap(1,""),
new DataWrap(3,""),
new DataWrap(6,""),
new DataWrap(9,""),
new DataWrap(8,""),
new DataWrap(4,""),
new DataWrap(7,""),
new DataWrap(0,""),
new DataWrap(11,""),
new DataWrap(10,""),
};
MergeSort1.mergeSort(data);
System.out.println(java.util.Arrays.toString(data));
}
}