21天打卡挑战 - 经典算法之直接选择排序

​CSDN打卡活动产出

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

创作计划


机缘

实战项目中的经验分享
日常学习过程中的记录
通过文章进行技术交流

收获

希望以此结交到志同道合的朋友

日常

平均每周产出2-3篇文章

有限的精力下,只能少一些玩游戏的时间,陪女朋友的时间不敢少

憧憬

期待粉丝上万 浏览过百万!!

**

扫描二维码关注公众号,回复: 14886541 查看本文章

学习计划

**
学习目标

永远充满热情,坚持21天学习打卡

学习内容

直接选择排序

学习日记


学习知识点

原理

        选择排序的核心思想是:每一趟从无序区中选出关键字最小的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止。

直接选择排序

        也称简单选择排序,整个过程就是每一趟都将无序区中的所有元素进行逐一比较,找到最小的元素,与无序区中的首个元素进行交换,有序区长度加1,无序区长度减1。重复以上步骤,直到所有的元素均已排好。

树形选择排序

        也称锦标赛排序,是为了优化每次在无序区中确定最小元素时比较次数过多的问题。核心思想是借助树形结构对整个序列进行两两比较,将数值较小的元素作为优胜者上升到父节点。最后能够在树形结构中记录每一次优胜者之间的关系,按规则取出即可。

堆排序

        堆排序是对树形选择排序的优化,由于树形选择排序需要花费较多的存储空间,堆排序的主要思想是构建一个小顶堆(升序排列中)。整个的过程就是不断的弹出堆顶元素,归入有序区,然后继续将堆中剩余元素调整为小顶堆,重复这个过程,直到排好所有元素。
 

算法步骤

        在第1趟中,从n个记录中找出关键字最小的记录与第1个记录交换;

        在第2趟中,从n-1个记录中找出关键字最小的记录与第2个记录交换;

        可以归纳为  在第i趟中,从n-i+1个记录中找出关键字最小的记录与第i个记录交换;直到完成i=n-1时的操作,此时整个序列有序。

算法复杂度

        选择排序不需要额外的存储空间,空间复杂度为O(1),所以是原地排序算法。

        最好、最差、平均时间复杂度都是O(n^2),因为无论你是否完全有序,还是完全逆序,都需要找出后边的最小值进行替换。

直接选择排序动图

 C代码


void selectsort(int a[],int n){
    for(int i=1;i<=n-1;i++){//进行n-1趟选择
        int index=i;
        for(int j=i+1;j<=n;j++)//从无序区选取最小的记录
            if(a[index]>a[j])
                index=j;
        if(index!=i)
            swap(a[i],a[index]);
    }
}

念念不忘,必有回响

猜你喜欢

转载自blog.csdn.net/qq_52213943/article/details/126217442