自底向上排序法,可以说比冒泡排序法快了很多。基本思想就是:
首先2个一组,一组的,排好序,
然后4个一组一组的排好序
.......8个........
直到全部排完
这里就是存在一个问题,中间过渡的时候,需要一个临时数组去保存数据,其实就是每一个片段都是插入排序法的变体。
代码如下:
private int[] sortedData;
public int[] Sort(int[] data)
{
sortedData = new int[data.Length];
int t = 1;
while (t < data.Length)
{
int dt = t * 2;
int i = 0;
while (i + dt <= data.Length)
{
merge(data, i, i + t, i + dt - 1);
i = i + dt;
}
if (i + t < data.Length)
{
merge(data, i, i + t, data.Length -1);
}
t = t * 2;
}
return sortedData;
}
private void merge(int[] data, int index1, int index2, int end)
{
int j = index1;
int k = index2;
int i = index1;
while (j < index2 && k <= end)
{
if (data[j] < data[k])
{
sortedData[i] = data[j];
j++;
i++;
}
else
{
sortedData[i] = data[k];
k++;
i++;
}
}
if (j == index2)
{
while (k <= end)
{
sortedData[i] = data[k];
k++;
i++;
}
}
else
{
while (j < index2)
{
sortedData[i] = data[j];
j++;
i++;
}
}
i = index1;
for (; i <= end; i++)
{
data[i] = sortedData[i];
}
}