1、选择排序
2、堆排序
1、选择排序
选择排序的思想其实就是选出数组中最小与最大的值分别放到数组的开头与结尾,然后选出次小的和次大的排在数组第二位和倒数第二位···直到排完。
其中,有一种特殊情况:
这个时候max在i = 1的位置没有变化,而min需要和这个位置的值进行交换,那么此时max所对应的值就到了min所在的位置,所以为了防止排序出错,此时需要更新max到min的位置。
void SelectSort(int* a, int n)
{
int begin = 0;
int end = n - 1;
int min = begin;
int max = begin;
while (begin < end)
{
min = begin;
max = begin;
for (int i = begin; i <= end; i++)
{
if (a[i] < a[min])
min = i;
if (a[i] > a[max])
max = i;
}
swap(&a[begin], &a[min]);
if (max == begin)
max = min;
swap(&a[end], &a[max]);
begin++;
end--;
}
}
2、堆排序
堆排序的原理是在大堆或小堆的基础上将根节点与最后一个节点交换,然后进行向下调整,因为大堆或小堆的根节点是整个堆中最大或最小的值,所以一直取堆顶元素最终会达到有序。
void AdjustDown(hpDataType* a, int n, int parent) //向下调整
{
int child = parent * 2 + 1; //默认孩子是左孩子
while (child < n)
{
//选出左右孩子中最大的一个
if (child + 1 < n && a[child] < a[child + 1]) //注意越界,child+1如果等与n就越界
{
child = child + 1;
}
if (a[child] > a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void HeapSort(int* a, int n)
{
//排升序,建大堆
//向上调整方法
/*for (int i = 1; i < n; ++i)
{
AdjustUp(a, i);
}*/
//向下调整方法
for (int i = (n - 2) / 2; i > 0; i--)
{
AdjustDown(a, n, i);
}
while (n > 0)
{
Swap(&a[0],&a[n-1]);
n--;
AdjustDown(a, n, 0);
}
}