zoukankan      html  css  js  c++  java
  • 排序算法整理

    参考博客:https://www.cnblogs.com/onepixel/articles/7674659.html

     快排空间复杂度

    最优的情况下空间复杂度为:O(logn)  ;每一次都平分数组的情况
    最差的情况下空间复杂度为:O( n )      ;退化为冒泡排序的情况

    1.插入排序

    过程

    从第一个元素开始,该元素可以认为已经被排序;

    取出下一个元素,在已经排序的元素序列中从后向前扫描;

    如果该元素(已排序)大于新元素,将该元素移到下一位置;

    重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    将新元素插入到该位置后;

    重复步骤2~5。

    我的话

    前面有序,后面第一个数字去插前面的应该是它的位置,原来有序区插的位置之后的数字往后移。

    为什么叫插入,因为是拿第一个数字去插前面的位置

    2.希尔排序

    过程

    3.选择排序

    过程

    初始状态:无序区为R[1..n],有序区为空;

    第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

    n-1趟结束,数组有序化了。

    我的话

    前面有序,后面无序去找出最小的数字放第一个(和原来的第一个交换),这个数字就变成有序区的了。

    为什么叫选择,因为是要在无序区选出一个最小的数字

    4.堆排序

    过程

    5.冒泡排序

    过程

    比较相邻的元素。如果第一个比第二个大,就交换它们两个;

    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

    针对所有的元素重复以上的步骤,除了最后一个;

    重复步骤1~3,直到排序完成。

    我的话

    从头开始一直比较相邻元素,比较完一趟最后一个数变成最大的,以此类推。

    为什么叫冒泡呢?相邻元素比较重复=冒泡  就是硬记

    6.快速排序

    过程

    从数列中挑出一个元素,称为 “基准”(pivot);

    重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    我的话

    随便选一个基准,左边比他小右边比他大,递归继续做左右两边

    为什么叫快速呢? 快速=以标准划分分递归  感觉比简单算法高端 就叫快速

    最好最坏分析

    最好情况O(n*logn)——Partition函数每次恰好能均分序列,其递归树的深度就为.log2n.+1(.x.表示不大于x的最大整数),即仅需递归log2n次; 最坏情况O(n^2),每次划分只能将序列分为一个元素与其他元素两部分,这时的快速排序退化为冒泡排序,如果用数画出来,得到的将会是一棵单斜树,也就是说所有所有的节点只有左(右)节点的树;平均时间复杂度O(n*logn)

    具体可以参考 https://blog.csdn.net/weixin_42109012/article/details/91645051

    7.归并排序

    过程

    把长度为n的输入序列分成两个长度为n/2的子序列;

    对这两个子序列分别采用归并排序;

    将两个排序好的子序列合并成一个最终的排序序列。

    我的话

    和快速的区别就是二分递归

    为什么叫归并呢?先分开,再归并,所以叫归并排序。

    8.堆排序

    过程

    将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆(从大到小就是小顶堆),此堆为初始的无序区;

    将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

    由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

  • 相关阅读:
    编程题练习
    算法:快速排序
    ansible的playbook剧本
    Django框架之验证码生成示例
    Django之auth模块用户认证模块
    Django框架之models和不依赖Qquery的ajax请求
    Django框架之序列化和上传文件
    Django高级篇一RESTful架构及API设计
    Git工具和GitHub的使用
    python之Flask框架
  • 原文地址:https://www.cnblogs.com/Annetree/p/13433394.html
Copyright © 2011-2022 走看看