首页 > 其他分享 >排序 - 选择排序 & 堆排序

排序 - 选择排序 & 堆排序

时间:2023-12-07 21:25:58浏览次数:29  
标签:结点 复杂度 堆排序 最小值 选择 算法 排序

选择排序

简单选择排序

算法描述

n-1次遍历,每次选出一个未排序区域中的最小元素放入已排序区域中的合适位置。

算法实现

void SelectSort(SqList &L) {
    for(i = 1; i < L.length; i++) {
        k = i;
        for(j = i + 1; j <= L.length; j++)
            if(L.r[j].key < L.r[k].key) k = j;
        if(k != i) {t = L.r[i]; L.r[i] = L.r[k]; L.r[k] = t;}
    }
}

算法分析

  1. 时间复杂度
    最好情况(初始正序):不移动
    最坏情况(初始逆序):移动3(n-1)次
    时间复杂度是O(n²)
  2. 空间复杂度
    交换元素时需要一个辅助空间,空间复杂度是O(1)

算法特点

  1. 稳定排序。
  2. 适用于链式存储结构。
  3. 移动次数较少。当每个记录占空间较大时,比直接插入排序快。

树形选择排序

算法描述

用有n个结点的完全二叉树表示,其中每个非终端结点的值是他的左右孩子的最小值,所以根的值是待排序列中的最小值。找到最小值之后,将最小值对应的叶子的值改为∞,对于该叶子到根的路径上的所有值进行过再次比较更新,找出次小值。

算法分析

  1. 时间复杂度
    除了最小值,选择其他关键字时只需要比较log2(n)次,时间复杂度为O(nlog2(n)).
  2. 所需存储空间多,存在与已被选出的叶子节点的多余比较。

堆排序

堆是一种满足所有非终端结点的值均不大于(小根堆)/小于(大根堆)其左右孩子结点的值的完全二叉树。其根必为最小/大值。

堆排序

算法描述

建立在完全二叉树的顺序存储基础上。先将待排序序列建成一个小根堆,交换根和最后一个值,即现在最后一个位置是最小值。然后从1到n-1个元素再次建立小根堆,交换第一个和最后一个值。也就是说每一次堆化再交换一次之后,能确定的就是排在序列后面部分的最大值。不断重复,直到交换了第一个和第二个值为止。

算法实现

  1. 筛选法调整堆
    从根到叶地进行调整,直到整个树再次符合堆的性质。
void HeapAdjust(SqList &L, int s, int m) {
    rc = L.r[s];
    for(j = 2 * s; j <= m; j *= 2) {
        if(j < m && L.r[i].key < L.r[j + 1].key) j++;
        if(rc.key >= L.r[j].key) break;
        L.r[s] = L.r[j]; s = j;
    }
    L.r[s] = rc;
}
  1. 建初堆
    只有一个结点的树一定是堆。完全二叉树中所有序号大于floor(n/2)的结点都是叶子,所以他们都是堆。所以只需要从最后一个非叶子节点floor(n/2)开始依次将以其及其前面序号的结点为根的子树调整为堆。
void CreateHeap(SqList &L) {
    n = L.length;
    for(i = n / 2; i > 0; i--) 
        HeapAdjust(L, i, n);
}
  1. 堆排序
    建初堆,然后反复进行堆顶堆底的交换和堆调整。
void HeapSort(SqList &L) {
    CreateHeap(L);
    for(i = L.length; i > 1; i--) {
        x = L.r[1]; L.r[1] = L.r[i]; L.r[i] = x;
        HeapAdjust(L, 1, i - 1);
    }
}

算法分析

  1. 时间复杂度
    平均时间复杂度接近于最坏性能O(nlog2(n))
  2. 空间复杂度
    需要一个交换辅助空间,复杂度为O(1)

算法特点

  1. 不稳定排序。
  2. 不适用于链式结构。
  3. 建初堆成本较大,不适用于元素较少的情况,元素较多时比较高效。

标签:结点,复杂度,堆排序,最小值,选择,算法,排序
From: https://www.cnblogs.com/ww0809/p/17881706.html

相关文章

  • Day22 Switch多选择结构
    Switch多选择结构多选择的除了if结构外的另一个实现方式:Switchcase语句(判断一个变量与一系列值中某个值是否相等,每个值称为一个分支)Switch语句中的变量可以是:byte,short,int或者char​从JavaSE7开始Switch......
  • 算法【快速排序】
    算法【快速排序】快速排序。选择一个作为比较的元素,这里我们选择首元素,这个元素我叫他‘比较元素’;前后两个指针(其实是索引变量)同时往后和往前进行遍历,开头的指针遇到比‘比较元素’大的元素停下来(空循环体的循环即可实现),末尾的指针往前遍历,遇到比‘比较元素’小的元素停下来;两个......
  • Mac capslock大写锁定键切换中英文的输入法新选择
    工作电脑是Mac,家里的电脑是Win。Mac上一直使用的是Rime输入法,用了https://github.com/iDvel/rime-ice这位大佬的配置Win上用的是搜狗用完搜狗再用Rime的时候,总是能感觉Rime的候选词策略很不顺手,搜狗一般是打出什么就是什么了,Rime就经常不符合期望。而且Rime的......
  • a-table(AntDesign Vue)实现表格行上下拖动排序
    参考链接:https://blog.csdn.net/song_de/article/details/125218350https://blog.csdn.net/m0_61342618/article/details/132556739?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-132556739-blog-125218350.235v39pc_releva......
  • 桶排序
    前K个高频元素给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。 示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1] 提示:1<=nums.length<=105k的取值范围是[1,......
  • 中大型企业选择CRM系统,这些功能要注意
    中大型企业客户数量多,业务复杂,需求多样,对CRM系统有着更高的要求。因此中大型企业在进行CRM选型时,有几个核心功能是一定要具备的。下面说说,中大型企业选择CRM系统必备功能是什么?1、客户信息管理CRM系统可以帮助企业收集、存储、分析客户的基本信息,以及客户的购买历史,偏好,反馈等......
  • Js中 列表里字典排序问题
    我又要给这样的列表,我想把出现"key3"的字典放到列表的后边constlist=[{key1:'value1',key2:'value2'},{key1:'value3',key2:'value4'},{key3:'value5',key2:'value6'},{key4:'......
  • Day21 顺序结构及选择结构中的If结构
    顺序结构Java的基本结构就是顺序结构,从上到下的顺序执行,是任何一种算法都离不开的基本算法结构packagecom.baixiaofan.struct;publicclassShunXuDemo{publicstaticvoidmain(String[]args){System.out.println("hello1");//按顺序一句一句执行......
  • 上机编程字典序排序总结
    1         字典序概念2021-0319上机编程认证的入门级&工作级第二题-可漫游服务区,输出结果要求字符串按照字典序降序排序,本文对各编程语言字典序排序方法做一个总结。题目描述漫游(roaming)是一种移动电话业务,指移动终端离开自己注册登记的服务区,移动到另一服务区(地区或......
  • 【数据结构和算法】排序算法
    使用swap函数来交换列表中的两项的位置1defswap(lyst,i,j):2'''交换列表中两项的位置'''3temp=lyst[i]4lyst[i]=lyst[j]5lyst[j]=temp①选择排序处于列表第一项,先找到最小项的位置,如果该位置不是列表的第一项,算法会交换这两个位置的项,然后......