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,则整个排序过程完成。

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/Annetree/p/13433394.html
Copyright © 2011-2022 走看看