这种排序方式需要满足两个特性:
- 待排序列所有值处于一个可枚举的范围
这个可枚举的范围不应该太大,否则开销太大
排序的具体步骤如下:
(1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;
(2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算:
buckets[i] = buckets[i] +buckets[i-1] (其中1<=i
public class MergeSort
{
public static void main(String[] args)
{
DataWrap[] dataWraps =
{ new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
new DataWrap(23, ""), new DataWrap(-30, "*"),
new DataWrap(-49, "*"), new DataWrap(21, ""),
new DataWrap(30, "*"), new DataWrap(13, "*"),
new DataWrap(15, ""), new DataWrap(28, "*"),
new DataWrap(-2, "*") };
System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
mergeSort(dataWraps);
System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
}
public static void mergeSort(DataWrap[] dataWraps)
{
sort(dataWraps, 0, dataWraps.length - 1);
}
private static void sort(DataWrap[] dataWraps, int left, int right)
{
if (left < right)
{
// 中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(dataWraps, left, center);
// 对右边数组进行递归
sort(dataWraps, center + 1, right);
System.out.println("left:" + left + " right:" + right);
// 归并
merge(dataWraps, left, center, right);
}
}
private static void merge(DataWrap[] dataWraps, int left, int center,
int right)
{
DataWrap[] arrTmp = new DataWrap[dataWraps.length];
int mid = center + 1;
int third = left;
int tmp = left;
while (left <= center && mid <= right)
{
// 将两个数组中取小放入临时数组
if (dataWraps[left].compareTo(dataWraps[mid]) < 0)
{
arrTmp[third++] = dataWraps[left++];
} else
{
arrTmp[third++] = dataWraps[mid++];
}
}
// 原数组剩余部分放入临时数组
while (mid <= right)
{
arrTmp[third++] = dataWraps[mid++];
}
while (left <= center)
{
arrTmp[third++] = dataWraps[left++];
}
// 临时数组内容拷贝到原数组
while (tmp <= right)
{
dataWraps[tmp] = arrTmp[tmp++];
}
System.out.println(Arrays.toString(dataWraps));
}
}