排序算法中有直接选择排序和堆排序。
(1)直接选择排序。是一种基于位置的排序,它第一趟选出最小的放在第一位,然后选出次小的放在第二位,然后依次类推。。。
for (int i=0;i<lenth-1;i++)
{
k = i;
for (int j=i+1;j<lenth;j++)
{
if (m_num[j] < m_num[k])
{
k = j;
}
}
if (k != i)
{
n = m_num[i];
m_num[i] = m_num[k];
m_num[k] = n;
}
}
这里的选择排序,在交换时没有保存值而是保存了坐标,找到后在交换,这样能是程序的扩展性更好,因为坐标肯定是整型。
(2)堆排序,把数组看成一棵树结构,在建堆的过程中也是一个选择的过程,堆排序的好处是能充分利用每次排序的结果,因为每一趟的比较选择都可能会有重复比较,堆排序利用树型结构很好的保存了比较结果。堆排序分三步:初始化建堆、交换值、调整堆。
void CSelectSort::HeapSift(int i, int n)
{
int j;
j = 2*i + 1;
double temp = m_num[i];
while (j < n)
{
if ((j<n-1) && (m_num[j]<m_num[j+1]))
{
j++;
}
if (temp < m_num[j])
{
m_num[i] = m_num[j];
i = j;
j = 2*i + 1;
}
else
break;
}
m_num[i] = temp;
}
void CSelectSort::HeapSort()
{
double temp;
for (int i = lenth/2-1;i>=0;i--)
{
HeapSift(i,lenth);
}
for (int j =lenth-1;j>=0;j--)
{
temp = m_num[0];
m_num[0] = m_num[j];
m_num[j] = temp;
HeapSift(0,j);
}
}
在堆排序中,要注意你下标,在调整堆的时候j<n进而在j<n-1说明根节点有两个可用的孩子,这时候才能进行j和j+1的比较。进而调整大根堆