数据结构

查找

   查找                                  平均时间复杂度                                   查找条件                               算法描述
顺序查找O(n)无序或有序队列按顺序比较每个元素,直到找到关键字为止
二分查找(折半查找)O(logn)有序数组查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。
二叉排序树查找O(logn)二叉排序树在二叉查找树b中查找x的过程为:
1. 若b是空树,则搜索失败
2. 若x等于b的根节点的数据域之值,则查找成功;
3. 若x小于b的根节点的数据域之值,则搜索左子树
4. 查找右子树。
哈希表法(散列表)O(1)先创建哈希表(散列表)根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。

排序算法

选泡插 (堆 快 希)
快归堆 希 桶计基
恩方 恩老 恩一三
对恩加K恩乘K
不稳稳稳不稳稳
不稳不稳稳稳稳
在这里插入图片描述
选择排序:从前往后,第一次确定最小的元素看是不是最左边的如果是就不变不是就最小的数和第一位数交换;第i次时后面n-i个关键字中最小的一个 如果不是第i位数,则和第i个记录交换,否则不变。从前往后确定i到n中第i个小的数与第i位数交换 (不稳)
Alt

冒泡排序:如果有n个元素需要比较n-1次,每一轮减少一次比较。就是从下往上相邻的俩俩元素比较(上<下不变,上>下交换),每一轮确定一个相对最小的到上面。
Alt

插入排序:将一个记录插入已经排好序的有序表中,(2,1比较确定2的位置3,2比较确定3的位置,4,3比较,…第i个位置和i-1比较如果i的数>i-1的数则不变如果i位置数小,则依次往前比较直到它正确的位置 被比较的依次后移一位)从前往后确定 i在i到1的从后往前的正确位置,i>i-1时不变基本有序,或者记录少时用直接插入排序
Alt

归并排序:1申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列.2设定两个指针,最初位置分别为两个已经排序序列的起始位置.3比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾4将另一序列剩下的所有元素直接复制到合并序列尾
Alt

堆排序:根节点一定是堆中所有节点最大或者最小者。(是完全二叉树,即从上到下按层都是从左到右开始排中间没空)还具有如果按层次遍历编号时满足(ki>=k2i,ki>=k2i+1)或者(ki<=k2i,ki<=k2i+1)下标i和2i,2i+1是双亲和子女的关系。1.构造初始堆,将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆) 2.将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。

希尔排序:直接插入排序增加了一个跨度,然后逐渐缩小跨度
Alt

快速排序:随便找一个数作为基准数,这里直接找第一位6作为基准,“6 1 2 7 9 3 4 5 10 8” 先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边指向数字6。让哨兵j指向序列的最右边指向数字8.
j->10->5停下 i->1->2->7停下 当俩个都停下时交换“6 1 2 5 9 3 4 7 10 8”
j->4停下 i->9停下 “6 1 2 5 4 3 9 7 10 8”
j->3停下 i->与j相遇停下后3和6互换 “3 1 2 5 4 6 9 7 10 8”
=============== “3 1 2 5 4 6 9 7 10 8” ===============
然后递归 3 1 2 5 4 时3为基准
j是指向4->5->2 i->1->遇到j停下2 1 3 5 4
=============== 2 1 3 5 4 6 9 7 10 8===============
然后21 以2为基准 j指向1 i指向2 。j开始1比2小不动 i->遇到j 1 2
=============== 1 2 3 5 4 6 9 7 10 8===============
然后5 4 变成 4 5
=============== 1 2 3 4 5 6 9 7 10 8===============
然后9 7 10 8 以9为基准i指向9 j指向8
j小于9不动 i->7->10不动 交换 9 7 8 10
j是10 往左遇到 i(8)与9交换 8 7 9 10
=============== 1 2 3 4 5 6 8 7 9 10===============
10只有一个数
=============== 1 2 3 4 5 6 8 7 9 10===============
8 7 变成 7 8
=============== 1 2 3 4 5 6 7 8 9 10===============

148. 排序链表

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4

归并排序

def m(head):
    if not head or not head.next:
        return head
    slow,fast=head,head.next                 # 用快慢指针计算中点
    while fast and fast.next:
        fast=fast.next.next
        slow=slow.next
    mid=slow.next                         # 
    slow.next=None                         # 中点断开
    left,right=m(head),m(mid)       #俩指针分别指向俩链表的头部
    res=h=ListNode(0)          #辅助链表
    while left and right:
        if left.val>right.val:
            h.next=right
            right=right.next
        else:
            h.next=left
            left=left.next
        h=h.next
    if left:
        h.next=left
    if right:
        h.next=right
    return res.next
return m(head)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值