选择排序&&堆排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
排序思想:
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面”后一个元素”现变成了”前一个元素”,继续跟他的”后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推

//选择排序
void SelectSort(int arr[],int size)
{
for (int i = 0; i < size; ++i)
{
int k = i;
for (int j = 1+i; j < size; ++j)
{
if (arr[k]>arr[j])
{
k = j;
}
}
swap(arr[k],arr[i]);
}
}

堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。接下来就是调堆和循环调堆

//堆排序,以小堆为例
//调整堆
void AdJust(int arr[], size_t root, size_t size)
{
size_t  parent = root;
size_t child = root * 2 + 1;
while (child<size)
{
//默认左孩子为较小的节点
if (child + 1 < size&&arr[child] > arr[child+1])
{
child = child + 1;
}
//如果孩子节点小于父亲节点,交换二者,将较小的节点向上调整
if (arr[child] < arr[parent])
{
swap(arr[child], arr[parent]);
parent = child;
child = parent + 1;
}
else
break;
}
}
void HeapSort(int arr[], int size)
{
//创建堆
for (int idx = (size - 2) / 2; idx >= 0; --idx)
{
AdJust(arr,idx,size);
}
//排序
int idx = size - 1;
while (idx>0)
{
swap(arr[0],arr[idx]);
AdJust(arr, 0, size);
idx--;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值