堆积排序是对直接选择排序的一种改进,具体实现如下:
代码
#region Heap Sort
private static void Adjust(int[] data, int rootIndex, int lastIndex)
{
if (data == null || data.Length < 1)
{
throw new ArgumentNullException("data");
}
int childIndex = 2 * rootIndex + 1, temp;
while (childIndex <= lastIndex)
{
if (childIndex < lastIndex && data[childIndex] < data[childIndex + 1])
{
childIndex++;
}
if (data[(childIndex - 1) / 2] >= data[childIndex])
{
break;
}
temp = data[(childIndex - 1) / 2];
data[(childIndex - 1) / 2] = data[childIndex];
data[childIndex] = temp;
childIndex = 2 * childIndex + 1;
}
}
/// <summary>
/// 堆积排序
/// </summary>
/// <param name="data"></param>
public static void HeapSort(int[] data)
{
if (data == null || data.Length < 1)
{
throw new ArgumentNullException("data");
}
for (int i = (data.Length - 1) / 2; i >= 0; i--)
{
Adjust(data, i, data.Length - 1);
}
int temp;
for (int i = data.Length - 1; i > 0; i--)
{
temp = data[i];
data[i] = data[0];
data[0] = temp;
Adjust(data, 0, i - 1);
}
}
#endregion
private static void Adjust(int[] data, int rootIndex, int lastIndex)
{
if (data == null || data.Length < 1)
{
throw new ArgumentNullException("data");
}
int childIndex = 2 * rootIndex + 1, temp;
while (childIndex <= lastIndex)
{
if (childIndex < lastIndex && data[childIndex] < data[childIndex + 1])
{
childIndex++;
}
if (data[(childIndex - 1) / 2] >= data[childIndex])
{
break;
}
temp = data[(childIndex - 1) / 2];
data[(childIndex - 1) / 2] = data[childIndex];
data[childIndex] = temp;
childIndex = 2 * childIndex + 1;
}
}
/// <summary>
/// 堆积排序
/// </summary>
/// <param name="data"></param>
public static void HeapSort(int[] data)
{
if (data == null || data.Length < 1)
{
throw new ArgumentNullException("data");
}
for (int i = (data.Length - 1) / 2; i >= 0; i--)
{
Adjust(data, i, data.Length - 1);
}
int temp;
for (int i = data.Length - 1; i > 0; i--)
{
temp = data[i];
data[i] = data[0];
data[0] = temp;
Adjust(data, 0, i - 1);
}
}
#endregion