6.归并排序:
将两个有序表合并为一个有序表.
/// <summary>
/// 归并排序.
/// </summary>
public void SortMethod7()
{
recNum = 0;
int count = m_playerList.Count;
int k = 1;
while(k < count)
{
Merge(k,count);
k*=2;
}
OutPutMsg();
}
void Merge(int len,int count)
{
int m = 0;
int s1 = 0;
int e1 = 0;
int s2 = 0;
int e2 = 0;
int i = 0;
int j = 0;
List<Player> temps = new List<Player>();
while(s1 + len < count)
{
s2 = s1 + len;
e1 = s2 - 1;
e2 = (s2 + len -1) < count ? (s2 + len -1):count;
j = s2;
i = s1;
while(i <= e1 && j <= e2)
{
if(m_playerList[i].level >= m_playerList[j].level)
{
temps.Add(m_playerList[i++]);
}
else
{
temps.Add(m_playerList[j++]);
}
}
while(i <= e1)
{
temps.Add(m_playerList[i++]);
}
while (j <= e2)
{
temps.Add(m_playerList[j++]);
}
s1 = e2 + 1;
}
i = s1;
while(i < count)
{
temps.Add(m_playerList[i++]);
}
for(i = 0;i < count;i++ )
{
m_playerList[i] = temps[i];
}
}
归并排序时间复杂度:0(nlog2n) ,空间复杂度:0(n)这个主要是temps临时存放了。
这个排序也理解了,就是一下不能马上写出来。