堆排序的主要原理就是利用堆的特点,首先生成最大堆,然后每次取堆的root和最后一个叶子交换,剔除最后叶子。然后再次生成最大堆,循环。
/// <summary>
/// 堆排序
/// </summary>
/// <param name="Myarray"></param>
/// <returns></returns>
private int[] HeapSotr(int[] Myarray)
{
int i;
HeadAdjust(Myarray, 0, Myarray.Length-1);
for (i = Myarray.Length-1; i > 0; i--)
{
Swap(Myarray, 0, i);
HeadAdjust(Myarray, 0, i-1);
}
return Myarray;
}
/// <summary>
/// 生成堆
/// </summary>
/// <param name="Myarray"></param>
/// <param name="s"></param>
/// <param name="m"></param>
private void HeadAdjust(int[] Myarray, int low, int high)
{
if ((low < high) && (high <Myarray .Length))
{
int j = 0;
int temp = 0;
int k = 0;
for(int i=high/2;i>=low;i--)
{
k = i;
j = 2 * k+1 ;
temp = Myarray[i];
while (j+1 <=high)
{
if (Myarray[j] < Myarray[j + 1])
++j;
if (temp < Myarray[j])
{
Myarray[k] = Myarray[j];
k = j;
j = 2 * k+1 ;
}
else
{
j = high + 1;
}
Myarray[k] = temp;
}
}
}
}
/// <summary>
/// 交换值
/// </summary>
/// <param name="Myarray"></param>
/// <param name="i"></param>
/// <param name="j"></param>
private void Swap(int[] Myarray, int i, int j)
{
int temp = Myarray[i];
Myarray[i] = Myarray[j];
Myarray[j] = temp;
}