选择排序和堆排序
什么是选择排序和堆排序
选择排序:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
堆排序:
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
选择排序
将数组中最大和最小的找出来和begin和end的位置的值进行交换然后减小范围begin++,end–,重复以上操作这样就成功进行了选择排序。
这里唯一要注意的就是交换min和begin后当最大值和begin重叠时将最大值的位置等于最小值的位置,不然就会进行重复交换没有意义。
void SelectSort(int* a, int n);
{
int begin=0, end=n-1;
int min=a[begin], max[end];
for (int i = 0; i < n; i++)
{
if (a[i] < min)
{
min = a[i];
}
if (a[i]>max)
{
max = a[i];
}
}
swap(a[min], a[begin]);
if (max = begin)
{
max = min;
}
swap(a[max] = a[end]);
begin++;
end--;
}
堆排序
这里就用到之前讲述堆的时候知识。如有不懂的伙伴可以进去复习一下。
堆,向下调整法
图例:
先建堆,建成之后让首元素和尾元素进行交换,再次进行向下调整算法,不断地将end控制最终保证一个都进行了排序,得到小堆。
void HeapSort(int* a, int n);
{
for (int i = (n - 1 - 1) * 2; i > 0; i--)
{
AdjustDwon(a, n, i);
}
int end = n - 1;
while (end > 0)
{
swap(&a[0], &a[end]);
AdjustDwon(a, n, 0);
end--;
}
}