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

  • 相关阅读:
    C++ 引用做左值
    C++ 引用本质的详解
    C++ 引用基础
    C语言错误 指针的类型错误
    C++ c++与C语言的区别(三目运算符,const修饰符)
    C++ c++与C语言的区别(struct类型的加强,函数-变量类型加强,bool类型)
    C++ c++与C语言的区别(实用性增强,register关键字增强,全局变量检测增强)
    C++ c++初识
    C语言 Linux内核链表(企业级链表)
    C语言 结构体中属性的偏移量计算
  • 原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950083.html
Copyright © 2011-2022 走看看