堆积排序是对直接选择排序的一种改进,具体实现如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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