【数据结构】排序算法之选择排序

本文探讨了两种排序算法——选择排序和堆排序。选择排序虽然简单,但在处理大量数据时效率较低,主要通过找到最大元素放至末尾的方式进行排序。而堆排序则通过构建大顶堆或小顶堆实现升序或降序排列。文中提供了相关代码示例及排序过程展示,旨在帮助读者深入理解这两种排序方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、选择排序——最差的排序算法
在选择排序中,假定我们需要升序,因此在每次排序中,需要找到最大的元素,将其放在最后,在每一次的循环中,都是将最大的元素放在最后,因此对于数据较多的数组,循环的次数将与数组中元素的个数一致,因此,在对于这种数组进行排序时,将十分的浪费时间。
有关选择排序的思路,如下所示:
(一)方式一,默认数组中最后一个元素最大,如下图所示:
这里写图片描述
代码如下所示:

void SelectSort(int *array, int size)
{
    assert(array || size < 0);
    int i = 0;
    int j = 0;
    int maxPos = 0;
    for (; i < size - 1; ++i)
    {
        maxPos = size - i - 1;//记录最大的元素,默认最后一个元素最大
        for (j = 0; j < size - i; ++j)
        {
            //找到最大的元素
            if (array[j]>array[maxPos])
            {
                maxPos = j;
            }
        }
        //将最大的元素与最后一个元素进行交换
        swap(array[maxPos], array[size - i - 1]);
    }
}

(二)方式二——利用前后指针的做法,在一趟排序中,一次全都将最大值与最小值找出来,最大值放在数组的最后,最小值放在数组的前面,然后分别改变两个指针的指向,直到两个指针相遇为止。
这里写图片描述
排序代码如下所示:

void SelectSort_OP(int *array, int size)
{
    assert(array || size < 0);
    int i = 0;
    int begin = 0;
    int end = size - 1;
    while (begin < end)
    {
        int minPos = begin;
        int maxPos = end;
        for (i = begin; i <= end; ++i)
        {
            //找最大与最小元素
            if (array[i]>array[maxPos])
            {
                maxPos = i;
            }

            if (array[i] < array[minPos])
            {
                minPos = i;
            }
        }
        //交换元素
        if (minPos != begin)
        {
            swap(array[minPos], array[begin]);
        }
        //防止在开始与结束分别出现最大与最小元素
        if (maxPos == begin)
        {
            maxPos = minPos;
        }


        if (maxPos != end)
        {
            swap(array[maxPos], array[end]);
        }
        begin++;
        end--;
    }
}

结果如下所示:
这里写图片描述

二、堆排序
要利用堆排序,首先要创建一个堆,这样才能进行堆排序
大堆——-升序
小堆- —–降序
这里写图片描述
实现如下所示:

void HeapAdjust(int*array, int size, int parent)
{
    //默认左孩子最大
    int child = parent * 2 + 1;
    while (child < size)
    {
        if (child + 1 < size&&array[child] < array[child + 1])
        {
            //右孩子较大
            child += 1;
        }

        if (array[parent] < array[child])
        {
            swap(array[parent], array[child]);
            parent = child;
            child = parent * 2 + 1;
        }
        else//已经是大堆,不需要调整
            break;
    }
}
void HeapSort(int *array, int size)
{
    assert(array || size < 0);
    //建堆
    int root = (size - 2) >> 1;//找到倒数第一个非叶子节点
    for (; root>=0; --root)//此处大于等于0,是为了一直调整到堆顶元素
        HeapAdjust(array, size, root);
    //排序
    int end = size - 1;
    while (end > 0)//直到数组中只剩一个元素,则不需要在调整
    {
        swap(array[0], array[end]);
        HeapAdjust(array, end, 0);
        --end;
    }


}

结果如下所示:
这里写图片描述

有关选择排序的内容就这么多了,希望大家一起进步!!!!

只有不停的奔跑,才能不停留在原地!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值