zoukankan      html  css  js  c++  java
  • 数据结构之内部排序--排序的基本概念

    排序

    有n个记录的序列${R_1,R_2,...,R_n}$,其相应的关键字的序列是${K_1,K_2,...,K_n}$,相应的下标序列1,2,...,n。通过排序,找出当前的下标序列1,2,...,n的一种排列$p_1,p_2,...,p_n$,使得相应的关键字满足如下的非递减(或者非递增)关系:$K_{p1} <= K_{p2} <= ... <=K_{pn}$,这样就得到一个按关键字乐有序的记录序列。

    内部排序与外部排序

    根据排序时数据所占用的存储器的不同,可以将排序分为两大类。一类是整个排序过程完全在内存中进行,称为内部排序;另一类是由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,称为外部排序

    主关键字与次关键字

    上面所说的关键字$K_i$可以是记录$R_i$的主关键字,也可以是此关键字,甚至可以时记录中若干数据項的组合。若$K_i$是主关键字,则任何一个无序的序列经排序后得到的有序序列是唯一3的;若$K_i$是次关键字或是记录中若干数据項的组合,得到的排序结果可能是不唯一的。

    排序的稳定性

    若在排序前的的队列中$R_i$领先于$R_j$其中$i<j$,经过排序后得到的序列中$R_i$仍然领先于$R_j$,则称排序方法是稳定的。反之领先关系在排序时发生变化,则称排序方法是不稳定的
    无论是稳定的还是不稳定的算法,都可以很好的排序,只不过在某些时候我们需要让他的顺序保持不变。

    常用排序的基本类型

    1.插入类排序

    -直接插入排序
    -折半插入排序
    -希尔排序
    
    排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
    直接插入 稳定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
    折半插入 稳定 $O(n^2)$ $O(nlogn)$ $O(n^2)$ $O(1)$
    希尔排序 不稳定 $O(n^{1.5})$ $O(1)$

    2.交换类排序

    -冒泡排序
    -快速排序
    
    排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
    冒泡排序 稳定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
    快速排序 不稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n^2)$ $O(log_{2^n})$

    3.选择类排序

    -简单选择排序
    -树形选择排序
    -堆排序
    
    排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
    简单选择排序 不稳定 $O(n^2)$ $O(n^2)$ $O(n^2)$ $O(1)$
    树形选择排序 稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$
    堆排序 不稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(1)$

    4.归并排序

    -归并排序
    
    排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
    归并排序 稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$

    5.分配类排序

    -多关键字排序
    -链式基数排序
    

    总结

    数据结构在计算机世界里承担很重要的角色。就例如十万个数排序快速排序的时间在0.5s左右(Python编写),而有的排序则需要十几分钟,可想而知,在现在大数据时代,没有一个好的数据结构,没有一个好的算法,对生产来说,十分不利。其次数据结构也大大的提升了自己的逻辑判断水平。对提升自己的编码水平,有很大的帮助,对自己以后研究算法,也会打下坚实的基础。或许这些算法以后用不到,但是我知道,其他复杂的算法都是在基础的算法之上建立的,也应当对这些基础算法进行了解。
    此篇文章参考
    【1】耿国华,张德同,周全名等.数据结构用c语言描述【M】.第二版.北京:高等教育出版社.2016.

    有什么问题请联系我

    QQ:3116316431 (请附上信息)
    E-mail:wongyinlong@yeah.net

  • 相关阅读:
    js-封装几个常用函数
    js获取地址栏的几种方法
    vue 子组件传值给父组件,兄弟组件传参以及实现动态组件
    实现同一个组件页面通过不同的tab标签页打开
    echarts柱状图一组数不同柱子的颜色修改
    echarts实现环形图
    vue 中JSONPath的使用方法之一
    vue element-ui 左侧菜单栏 el-menu属性实现动态菜单
    vue 前端服务器代理,proxyTable简要叙述
    分享一篇IBN(Intent-based networking)调研报告
  • 原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950083.html
Copyright © 2011-2022 走看看