python实现10大排序算法详细介绍及排序思想介绍

Python实现10大经典排序算法 快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。 阅读详情

什么是排序?

  • 排序是按关键字的非递减或者非递增顺序对一组记录重新进行排列的操作。

(1)排序的稳定性

  • 通俗地讲,就是排序前 Ri 在 Rj前面,排序后Ri仍领先于Rj, 则说明是稳定的。(Ri<Rj)
    在这里插入图片描述

(2)内部排序与外部排序在这里插入图片描述

(3)内部排序方法的分类

在这里插入图片描述

(4)待排序记录的存储方式

  • 一般为顺序存储结构
  • 或者是链式存储结构

(5)排序算法效率的评价指标

在这里插入图片描述

一.插入排序

(1)直接插入排序

"""
直接插入排序:
采用将r[i]与r[i-1], r[i-2],...,r[1],从后向前的进行比较,也就是采用顺序查找法,查找当前元素应该插入的位置。
特点:
1. 稳定排序
2. 算法简便且容易实现
3. 适用于链式存储结构。
4. 更适用于初始记录基本有序的情况。

5. 初始记录无序,n(排序元素个数) 过大时,不宜采用。

时间复杂度为:O(n^2)
空间复杂度为: O(1)  需要一个辅助空间作为元素交换(python不需要辅助空间)
"""
arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]

def InsertSort(l):
    count = len(l)
    for i in range(1, count):
        j = i
        temp = l[i]
        while j > 0 and temp < l[j-1]:  # 当j = 1 时,就已经是 l[1] 和 l[0] 进行比较了,注意这里的条件不能是>= 0
            # l[j], l[j-1] = l[j-1], l[j]
            l[j] = l[j-1]
            j -= 1
        l[j] = temp

InsertSort(arr)          
print(arr)

(2)折半插入排序

"""
折半插入排序: 不同于 直接插入排序的顺序查找位置,采用“折半查找”,就叫做折半插入排序。
特点:
1. 稳定排序。
2. 要进行折半查找,所以只能用于顺序结构,不能用于链式结构。
3. 适合初始记录无序,n较大的情况。

时间复杂度:O(n^2)
空间复杂度: O(1)

平均时间性能要优于直接插入,但是我觉得, 折半和顺序直接插入都一样,1.都是要找到插入位置, 2.移动元素插入进去
不管咋样查找插入位置,都要移动。没啥大的差别。 直接插入是边判断边移动, 折半是 判断好了,移动完成再插入
"""

arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]

def BInsertSort(l):
    n = len(l)
    for i in range(1, n):
        temp = l[i]
        low = 0
        high = i-1
        while low <= high:  # 循环判断出插入位置: 这里很巧妙,想了很久!  不论怎样最后 low 和 high 都会相等
            mid = int((low + high)/2)               # 指向最后一个比较元素, 且无论比较如何,插入位置都是 high + 1 (牛!)
            if l[i] < l[mid]:
                high = mid - 1
            else:
                low = mid + 1   
        
        for j in range(i-1, high+1-1, -1):  # 倒序 ,知道插入位置后, 一个个的把位置前的数字后移一位
            l[j+1] = l[j]
        
        l[high+1] = temp  # 插入该元素
        

BInsertSort(arr)
print(arr)

            


(3)希尔排序

"""
希尔排序(缩小增量排序):直接插入排序,当待排序的记录个数较少且待排序序列的关键字基本有序时,效率高.
    希尔排序针对 “减少记录个数”, “序列基本有序” 两个方面对直接插入排序进行改进。

实现算法:采用分组插入的方法,先将整个的待排序记录序列分割成几组,从而减少曹郁直接插入排序的数据量,对每组分别进行直接插入排序,
然后增加每组的数据量,重新分组。这样当经过几次分组排序后,整个序列中的记录“基本有序”时,在对全体数据进行依次直接插入排序。

特点:
1. 不稳定的排序(记录跳跃式地移动)
2. 只能用于顺序结构
3. 最后一个增量必须为 1,才能排序成功。
4. 记录总的比较次数和移动次数,都要比直接插入排序要少, n越大越明显。适合初始数据无序, n较大的情况。

时间复杂度: O(n^ 3/2),  科学计算某些情况下,比较合适移动次数 大概为 n^1.3, n 趋近无穷大时为: n(log2 n)^2
空间复杂度: O(1) , 只需要一个辅助空间
"""
arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]

def ShellInsert(l, dk):
    """ 执行dk间距的排序 """
    n = len(l)
    for i in range(dk, n):   #  这里这样写省略了一层循环,非常巧妙。 因为 dk+1, dk+2, dk+3 会分为以这三个开头的三个小列表,分别排序。
        temp = l[i]          #  但是这里发现,不用多一层循环分开排序这三小个,一层大循环就会做到这些功能,读者可以自行模拟该过程!很神奇
        j = i
        while j>=dk and temp < l[j-dk]:  # 这里 j>= dk, 实际上当dk=1时,也就是直接插入排序,就相当于是 j >= 1 ,等价于j>0(与直接插入一致),
            l[j] = l[j-dk]              # 解决的是计算插入位置小于0的情况比如: 下面注释讲解
            j = j-dk
        l[j] = temp    

def Shellsort(l, dk):
    """ 指定dk值, 逆序dk -- 1去执行希尔排序 """
    for k in range(dk, 0, -1):  # 逆序
        ShellInsert(l, k)

Shellsort(arr, 3)
print(arr)

"""
当执行 ShellInsert(arr, 3)时,读者可以自己一步步走这个过程。当执行最后一趟循环,i== 8时,

arr = [17, 26, 31, 44, 55, 93, 54, 77, 31, 20]
很明显 20 要和 93, 31 进行比较,但 如果 j >0 而不是 j >= dk, 得到最后 j 值计算到 31的位置时等于 2,
还要去 j-dk, 就得到了错误的下标 -1, 所以这里是 j >= dk, 很细节!

"""

交换排序

(1)冒泡排序

"""
冒泡排序特点
1. 稳定排序
2. 可用于链式存储结构
3. 移动记录次数较多,算法平均时间性能比直接插入排序差。

当n较大,初始记录无序时,此算法不宜采用。

时间复杂度:O(n**2)
空间复杂度:O(1) 只要一个辅助空间,做交换用
"""

a = [23, 45, 12, 67, 44, 78, 2, 99]

def bubbleSort(arr):
    """ 最基础版本,任何数组,都要全部进行比较 """
    n = len(arr)

    for i in range(n):
        for j in range(0, n - i -1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]


def plusBubbleSort(arr):
    """ 升级版,提前判断出数组已经排序好了 """
    n = len(arr)
    flag = 1 # 当不等于1 时,说明没有做交换,已经排好顺序
    while n != 0 and flag == 1:
        flag = 0
        for j in range(n - 1):
            if arr[j] > arr[j + 1]:
                flag = 1
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
        n -= 1    

plusBubbleSort(a)
print(a)


# 两个for 循环版本的
def bubbleSort1(arr):
    """ 最基础版本,任何数组,都要全部进行比较 """
    n = len(arr)
    flag = 1
    for i in range(n):
        flag = 0
        for j in range(0, n - i -1):
            if arr[j] > arr[j + 1]:
                flag = 1
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

        if flag == 0:
            break

(2)快速排序

"""
快速排序(由冒泡排序改进而来, 能通过两个不相邻的记录的一次交换,消除多个逆序,加快排序速度)

1. 不稳定的排序。(记录非顺次的移动导致排序方法是不稳定的)
2. 排序过程中需要定义上下界,不适合用于顺序结构,很难用于链式结构。
3. 适合排序 元素(n)数量较大的情况, 在平均情况下,它是内部排序方法中速度最快一种。

适合初始记录无序,n较大的情况

平均时间复杂度:O(nlog2 n), 最坏情况是 O(n)
空间复杂度: 最好情况下是 O(log2 n),最坏情况下是O(n)

递归的快速排序,执行时需要用一个栈来存放相应的数据,最大递归调用次数与递归树的深度一致。

递归查找用树表示的是: 递归树。

"""

arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]

def Partition(l, low, height):
    pivotkey = l[low]
    while low < height:
        while low < height and l[height] >= pivotkey:
            height -= 1
        l[low] = l[height]

        # low += 1
        while low < height and l[low] < pivotkey: 
            low += 1
        l[height] = l[low]
        # height -= 1  # 按照正常的思路,应该执行这两个 low += 1, height -= 1 但是关键就错在,这两个值,会使low height指针重合后,再次发生偏移。 因为他们一定执行,不受限制。 所以不能加这两个语句,让他们在while 内部判断即可
    l[low] = pivotkey

    return low

def Qsort(l, low, height):
    if low < height:
        p = Partition(l, low, height)
        Qsort(l, 0, p-1)
        Qsort(l, p+1, height)

def QuckSort(l):                                               
    Qsort(l, 0, len(arr) - 1)

QuckSort(arr)
print(arr)

快速排序-分区逻辑:

二向切分的逻辑应用(快慢指针)

在这里插入图片描述

  • 和快速排序中 pivotkey的快慢指针的思路是如出一辙。(前面小于pivotkey,中间大于pivotkey,后面还未护理到。只是判断条件不一样了)
    在这里插入图片描述

三路快排的分区逻辑

  • 对撞指针,比上面的代码实现好在。 处理了 分区去 有 等于pivotkey的区间。 处理时直接省略过去不用出里了。
    在这里插入图片描述
  • 实现
    在这里插入图片描述
  • 应用:75号算法题:颜色分类
    在这里插入图片描述

在这里插入图片描述

选择排序

(1)简单选择排序

# 简单选择排序
"""
# 简单选择排序
1. 稳定的排序
2. 可用于链式存储结构
3. 移动记录次数较少,当每次占用的空间较多时,此方法比直接插入排序快。

与冒泡排序一样:
时间复杂度: O(n^2) 
空间复杂度: O(1)   只需要一个辅助空间(python里辅助空间都是不需要的)
"""

arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]
def simple_Quicksort(arr):
    length = len(arr)

    for i in range(length - 1):
        min = arr[i]  #记录下标即可, 这里采用有定义一个 min,看的比较清晰
        index = i
        for j in range(i+1, length):
            if min > arr[j]:
                min = arr[j]
                index = j
        arr[i], arr[index] = arr[index], arr[i]

# simple_Quicksort(arr)


(2)堆排序

# 树形选择排序
"""
树形选择排序:
在简单选择排序的基础上进行改进:
    简单选择排序,在n个之中选择最小的, 至少要进行n-1次比较,
    当继续在剩余的n-1个关键字中选择最小值, 未必非要进行n-2次比较,
    若利用前面的n-1次比较所得的信息,则可以减少以后各趟选择排序中所用的比较次数,
    类似于 体育比赛中的锦标赛。

树排序尚且有 辅助存储空间较多, “最大值“进行多于的比较等缺点
"""

# 堆排序
"""
堆排序:
是一种树形选择结构,将待排序的记录r[1..n] 看成是一颗完全二叉树的顺序存储结构,
利用完全二叉树中双亲节点和孩子节点的内在关系,在当前的无序的序列中选择关键字最大(或者最小)的记录。

实际上,堆就是 满足如下性质的二叉树:树中所有非终端节点的值均不大于(或者不小于)左,右孩子的值。
(二叉树和完全二叉树的性质,参考课本119页!)

大根堆,小根堆:堆顶元素(就是完全二叉数的根节点),比为n个元素中的最大值(大根堆),或者最小值(小根堆)。


特点:
1. 算法是不稳定排序
2. 只能用于顺序结构,不能用于链式结构
3. 记录数较高时,有优势。 相对于快速排序的最坏时间复杂度O(n^2),是一个优点。

时间复杂度:最坏时间复杂度:O(nlog2 n) (平均时间复杂度接近最坏时间复杂度)
运行时间主要耗费在 建立初堆和调整堆时进行的反复“筛选”上。
空间复杂度:O(1) 只需要一个辅助空间( python交换两个元素,也不需要辅助空间)
"""

# 例如,大根堆的排序过程如下
"""
(1) 按照按堆的定义,将待排序的序列 r[1..n]调整为大根堆(这个过程就是建初堆),交换r[1] 和 r[n],则r[n]为关键字最大的序列
(2) 将r[1..n-1] 重新调整为堆,交换r[1] 和 r[n-1], 则r[n-1]为关键字的次大的记录。
(3) 循环 n-1次, 直到交换了r[1] 和 r[2] 为止,得到了一个非递减的有序序列r[1..n]

所以实现堆排序,主要考虑两个问题:
(1) 建初堆:如何将一个无序序列建成一个堆?
(2) 调整堆: 去掉堆顶元素,在堆顶元素改变之后,如何调整剩下的元素成为一个新堆?
"""

a = [49, 97, 65, 49, 76, 13, 27, 38]

# 筛选法
def HeadAdjust(l, root_index, m):
    """ 筛选法调整大根堆
        :param      l: 列表
        :param      root_index: 根的索引
        :param      m: 列表长度-1, 就是最后一位元素的下标值
     """
    rc = l[root_index]
    i = root_index*2 + 1
    while i <= m:  # 这里也必须是 <=, 试想当只有两个元素的时候, i = 2,正好 i=m, 执行。
        if i<m and l[i]<l[i+1]:  # 这里的 i<m, 就是用来判断,当最后叶子节点为1的时候,不会去算右节点 l[i + 1], 也就不会超出列表长度了
            i += 1
        if rc > l[i]:
            break
        l[root_index] = l[i]
        root_index = i
        i = i*2 + 1
    l[root_index] = rc

"""
给出C语言版本的,真的是简洁,for循环代替递归,变量复用~ 简直完美! python for range循环我觉得不容易实现,才改成while循环
void HedpAdjust(SqList &L, int s, int m)
{
    // 假设r[s+1..m],已经是大根堆, 将r[s..m]调整为以r[s]为根的大根堆
    rc = L.r[s];
    for(j=2*s; j<=m; j*=2)        // 沿着key较大的孩子节点向下筛选
    {
        if(j<m && L.r[j].key < L.r[j+1].key) ++j;  // j为key较大的记录下标
        if(rc.key>= L.r[j].key) break;
        L.r[s] = L.r[j]; s=j;        // 解决递归问题, s重新赋值为 j,开始新的计算
    }
    L.r[s] = rc      // 插入
}

与python版本的区别是  二叉树的性质:
c语言实现,下标从1开始,  与子节点的关系是:  i(根) ,  2i(左),   2i +1(右)
python下标从零开始:   与子节点的关系是:  i(根) ,  2i + 1(左),   2i + 2(右)

其他全部相同,就是改个下标~
"""
# HeadAdjust(a, 0, 7)

# 建初堆:
""" 只要是抓住一条性质,完全二叉树,序号大于 n/2 的节点都是叶子, 我们对[1..n/2]的节点依次调用 上面的筛选法,建立初堆 """

b = [49, 38, 65, 97, 76, 13, 27, 49]
def CreateHeap(l):
    """ 建立初堆 """
    n = len(l)
    for i in range(int(n/2)-1, -1, -1):  # 逆序, int(n/2)-1:第一个元素的下标, -1,开区间,为-1才能取到0
        HeadAdjust(l, i, n-1)

# CreateHeap(b)


# 堆排序: 就是先进行 1.建初堆,2.进行调整堆
def HeapSort(l):
    CreateHeap(l) # 建成大根堆
    # 将根元素(最大的元素),与最后一个元素互换位置,然后重新调整,找出次最大的,依次进行
    n = len(l)
    for i in range(n-1, 0, -1):
        l[0], l[i] = l[i], l[0]
        HeadAdjust(l, 0, i-1)

HeapSort(b)
print(b)

计数排序

  • 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)
  • 下面可以看一道使用计数排序解决的算法题:力扣1365号. 有多少小于当前数字的数字
    在这里插入图片描述
  • 解法如下:基数排序就是利用所有元素在一定范围内。 可以是用数组索引表示出每一位,然后数组索引对应的元素,表示该值出现了多少次,计数。
class Solution:
    def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
        """
            基数排序解法
        """
        # 数值大小是 0-100, 我们生成101长度的数组,计算每个元素出现的次数
        count = [0] * 101
        for num in nums:
            count[num] += 1

        # 再次当前位置的元素前面有多少小于它的元素
        for i in range(1, 101):
            count[i] += count[i - 1]
        
        rst = [0]*len(nums)
        # 返回对应的计数数组
        for i, num in enumerate(nums):
            rst[i] = count[num - 1] if num > 0 else 0
        
        return rst

归并排序

  • 归并排序,也是递归的思想,还有非递归的方式。
    在这里插入图片描述
"""
归并排序:将两个或者两个以上的有序表合并成一个有序表的过程。
2-路归并: 将两个有序表合并成一个有序表的过程。最为简单常用。

"""
arr = [3, 6, 9, 4, 7, 13, 16]  
a = [0]*9
arr1 = [54, 26, 93, 17, 77, 31, 44, 55, 20]

# 1. 先实现两个 有序序列的 归并,这里设两个有序表分别存在同一列表中l[low..mid], [mid..high]。
def Merge(l, t, low, mid, high):
    """
        :param      l:排序列表(存放两个有序表)
        :param      t:将l中的记录,由小到大的并入其中
        :param      low: 第一个有序表开始位置(l 首元素)
        :param      mid: 第二个有序表开始位置(l 中间位置)
        :param      high: 第二个表结尾 (l结尾)
        实现思路: 将左右子数组拷贝到 t(临时数组中),将归并后的正确结果,还放回去到l对应的位置
    """

    # 拷贝l 对应的元素到 t里来  
    for i in range(low, high+1):
        t[i] = l[i]

    i = k = low
    j = mid + 1

    # 合并之后的排序,重新放回 l
    while i <= mid and j <= high:
        if t[i] < t[j]:
            l[k] = t[i]
            i += 1
        else:
            l[k] = t[j]
            j += 1
        k += 1

    # 将 两个有序表,其中的剩余元素,添加进 l对应的尾部
    """ 实际上这里可以使用extend()方法,或者 列表的+操作代替,但是算法就要原汁原味,我们不动用函数,只用append函数想列表里添加元素"""
    while i <= mid:
        l[k] = t[i]
        i += 1
        k += 1

    while j <= high:
        l[k] = t[j]
        j += 1
        k += 1

# print(arr)
# Merge(arr, a, 0, 3, 6)
# print(arr)
# print(a)

def Msort(l, t, low, high):
    """ 归并排序 """
    # 当只有一个元素时,一定要返回上一层
    if(low >= high): return    
    
    mid = (low+high)//2  # 注意这里 low-->mid  和 mid + 1 -->high 才是平分!   我之前写的 low --> mid - 1,   mid --> high 不是平分会报错!细节问题
    Msort(l, t, low, mid)
    Msort(l, t, mid+1, high)
    # 最小子问题,左右各有一个元素,执行排序合并
    Merge(l, t, low, mid, high)

def MergeSort(l, t):
    Msort(l, t, 0, 8)

MergeSort(arr1, a)
print(arr1)

基数排序

这里给出完全二叉树相关的相关性质:

在这里插入图片描述

  • 特性:对堆理解有用
    在这里插入图片描述
先到这里了,归并算法好像还有点问题~ 需要后续再思考,调整一下补充一下,这里并没有列出基数排序(脑袋一次性接收不了这么多了~~~~)

补充:排序算法的选择与比较

(1)排序算法的比较

在这里插入图片描述

(2)排序算法的选择

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)如何写一个通用的排序算法

  • 如java中的内置方法 sort()就是一个通用排序。

对于基本类型的比较:比如int

在这里插入图片描述

对于引用类型,有两种方式实现在这里插入图片描述

python中也是一样

  • 可以实现 __eq 和 __lt 等方法, 使对象变成可比较的
    在这里插入图片描述

Java引用类型的通用排序

  • 顺序
    在这里插入图片描述
  • 这里不再使用 快速排序,因为快速排序是 不稳定排序!, 可能影响最终排序结果。
    在这里插入图片描述
10种排序算法(Python例子) 10中排序算法 给定一个无序数列,将数列中的数有效的排序。(降序升序不限) 已知数列:arr = [2,5,6,8,98,6,52,36,24,1,2,3,5,54,5] 冒泡排序:     冒泡排序是一种简单的排序算法,其原理是依次遍历整个数组,一次比较两个元素,如果他们顺序错误,就把他们交换过来。走访数列的工作是重复地进行,指导没有再需要交换,也就是说该... 阅读详情

相关推荐

Python算法实现之排序算法的Python实现详解

排序算法是计算机科学中最基础和最重要的算法之一。它们在数据处理中起着关键作用,广泛应用于搜索、数据分析和优化等领域。本文将详细介绍几种常见的排序算法及其Python实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序,并通过具体示例代码展示它们的工作原理和性能比较。

Rocky006的博客 1237

python快速排序

python快速排序 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程递归进行,以达到整个数据变成有序序列。 快速排序过程: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。 (3)然后,左边和右边的数据可以独立排序。对于左侧的数组

weixin_44408454的博客 398

十大排序算法(Python实现)

十大排序算法(Python实现) 十种常见排序算法可以分为两大类 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳...

one_zero_one的博客 1317

万字长文,链表排序算法——冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排序、基数排序精讲及python实现

在数组排序中,常见的排序算法有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。而对于链表排序而言,因为链表不支持随机访问,访问链表后面的节点只能依靠next指针从头部顺序遍历,所以相对于数组排序问题来说,链表排序问题会更加复杂一点。下面先来总结一下适合链表排序与不适合链表排序的算法:冒泡排序选择排序插入排序归并排序快速排序计数排序桶排序基数排序。希尔排序。堆排序。希尔排序为什么不适合链表排序?希尔排序:希尔排序中经常涉及到对序列中第。

白话机器学习 4819

电赛经验分享——赛前准备

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。⏩在之前的电赛中取得了省一的成绩,本文对电赛比赛前需要准备什么做一个经验分享。加入小光嵌入式交流群(qq群号:737327353)免费获取博主所有资料哦!

qq_52608074的博客 7778

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 386

9种常用排序算法总结(超详细)

以int型数据为例,且0号下标数组用来做为交换辅助空间,数据从1号下标开始存储 一、插入排序 基本思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序记录全部插入为止。 直接插入排序 排序过程: 1、将待排序数组arr[1…n]看作两个集合,arr[1]为有序集合中元素,arr[2…n]为无序集合中元素,a[0]用来临时存放当前待排序记录 2、外层循环每次从无序集合中选择一个待插入元素(n-1次),每次使用顺序查找法,内层循环查找arr[i]在有序集合中的.

qq_39471489的博客 1万+

Zephyr 开发必备技能:一文搞懂 west manifest

本文深入解析Zephyr项目的westmanifest工具与Manifest文件管理,从基础概念到高级应用。文章首先介绍westmanifest作为Zephyr模块化架构的核心工具,负责管理west.yml文件中的模块信息、Git地址及版本控制。随后详细讲解Manifest文件的基本结构、字段含义,以及westmanifest子命令的使用方法,包括查看内容、冻结版本、验证文件等操作。文章还探讨了Manifest的导入继承机制和在团队协作中的版本管理策略,并给出常见问题排查技巧。最后强调Manifest文件作

hemoparrot的专栏 1254

数据结构学习笔记——选择排序(简单选择排序和堆排序)

以递增为例,在每一趟的简单选择排序过程中,每次选取当前元素最小的元素,将其作为有序子序列的第i,i+1,……个元素,依次进行下去,即和第一个元素交换,依次进行交换,直到剩余一个元素,此时整个序列已经有序,每一趟简单选择排序可确定一个元素的最终位置。 递增的简单选择排序代码如下: ```c /*简单选择排序(递增)*/ void SelectSort1(int r[],int n) { int i,j,min,temp; for(i=0; i

小宇y的博客 1万+

【花雕学编程】Arduino ESP32 SPP 之使用Servo库控制360度舵机正反转

使用 Servo 库控制 360 度舵机的正反转是 Arduino ESP32 SPP 应用中的一个重要案例,具有简易控制接口、灵活速度调节和高兼容性等特点,广泛应用于机器人、自动化装置和动态艺术等领域。在第三个案例中,使用map()函数将用户输入的速度参数(范围0-100)映射到舵机控制的角度(0-180),使得用户能够以更人性化的方式控制舵机速度。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 1468

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 202

Java实现八大排序算法

在学习数据结构的过程中顺便复习了排序算法,笔者用java实现了八种排序算法。其中有借鉴 经过一个多星期的学习、收集、整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题。代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步。 参考:数据结构(c语言版 第2版)、小甲鱼数据结构视频、百度相关帖子 /** * 1、插入排序 直

岁月~ 982

一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型

如果你记住这三句话,这篇文章就值了:🎯摄像头带宽 = 分辨率 × 位深 × fps × 开销4K RAW 摄像头 ≈ 3.7Gbps,是现实不是理论SerDes 选型,宁可多留 20%,不要刚刚好。

weixin_43199439的博客 189

10 大经典排序算法 Python 版实现(附动图演示)

排序算法是《数据结构与算法》中最基本的算法之一,也是面试中最频繁考察的知识点。在本文我将详细介绍10种常见的内部排序算法,及如何用Python实现。喜欢记得收藏、关注、点赞。 注:完整版代码、资料、技术交流文末获取 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 用一张图概括: 关于时间复杂度:

Python学习与数据挖掘 3227

【红绿灯识别】基于计算机视觉实现道路信号灯检测识别系统附Matlab代码

随着自动驾驶技术的快速发展,对道路交通信号灯的检测识别技术也提出了更高的要求。本文提出了一种基于计算机视觉的道路信号灯检测识别系统,该系统能够准确地检测和识别道路交通信号灯,并输出信号灯的颜色信息。该系统采用深度学习方法,利用卷积神经网络(CNN)对道路交通信号灯进行检测和识别。实验结果表明,该系统能够在复杂的环境中准确地检测和识别道路交通信号灯,具有较高的实用价值。道路交通信号灯是道路交通管理的重要组成部分,它能够有效地组织交通,提高道路通行效率,保障交通安全。

qq_59747472的博客 338

作为专家系统与应用的审稿人:提醒你投稿注意事项

本文为《专家系统与应用》(ESWA)期刊投稿指南,重点强调研究方向匹配性、学术质量和写作规范。要求论文以智能系统/算法为核心,突出增量创新并具可验证性,需包含严谨方法论和充分实验验证。写作需结构清晰,符合期刊格式要求,包括明确的研究问题、分类文献综述、详细技术实现和量化结果。投稿前需仔细核对期刊指南,引用相关文献,并妥善处理审稿意见。ESWA注重创新实质性和应用落地价值,建议突出智能系统设计核心,避免成为单纯技术应用描述。

ZhangJiqun&191cm&85kg 1795

用 Python 实现十大经典排序算法

10种经典排序算法包括冒泡排序、选择排序、快速排序、归并排序、堆排序、插入排序、希尔排序、计数排序、桶排序、基数排序等。 当然,还有一些其他的排序算法,大家可以继续去研究下。 01冒泡排序 冒泡排序(Bubble Sort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。 注:上图中,数字表示的是数据序列原始的索引号。 算法过程 比较相邻的元素,如果前一个比后一个大,就把它们两个对调位置。 ..

m0_59485658的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

排序算法——(2)Python实现十大常用排序算法

上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——(1)简介这篇文章复习一下。 今天将为大家介绍常用的十大排序算法中最简单的五种(冒泡、选择、插入、希尔、归并),主要从:过程图解、算法思想、代码实现、算法分析这四个方面讲解,建议大家看完之后自己动手...

猪哥 1994

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

排序算法基本介绍及python实现(含详细注释)

对数组排序可以说是编程基础中的基础,本文对八种排序方法做简要介绍并用python实现。 代码中注释很全,适合复习和萌新学习。这是刚入学自己写的,可能难免比不上标准的写法,但是懒得改了。 文末会放和排序相关的基本拓展总结链接。 看不明白可以看群里视频 注意排序实现的具体方式,不要用局部变量,否则占空间太多,和空间复杂度不符。 好,我们开始。 选择排序 选择排序(Selection sor...

少说,多做。 1万+

排序算法之插入排序(python实现)

插入排序的基本思想:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入位置。即边插入边排序,保证子序列中随时都是排好序的。

qq_43129538的博客 4536

python实现十大排序算法(详解)

之前在这C语言实现八大排序算法(一)和C语言实现八大排序算法(二)2篇文章中,已经详细介绍了各种排序算法的思想,参考资料主要是用C语言实现的。本文主要用python语言再次实现十大排序算法。 十大排序算法的复杂度及稳定性分析如下表所示: 插入排序 代码 ''' 1. 从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大...

From Zero to Hero 2330

Python实现5大排序算法

不同的排序算法在时间复杂度、空间复杂度以及稳定性等方面有所不同,选择适合具体情况的排序算法可以提高排序效率。

Trb701012的博客 912

十大经典排序算法原理详解及其Python实现

文章目录摘要一、插入排序1、算法思想:2、举例演示:3、python实现4、复杂度和稳定性二、选择排序1、算法思想2、特点3、python实现3、复杂度和稳定性三、冒泡排序1、算法思想2、python实现3、复杂度和稳定性四、快速排序1、算法思想2、python实现3、复杂度和稳定性五、归并排序1、算法思想2、python实现3、复杂度和稳定性六、希尔排序1、算法思想2、python实现3、复杂度...

weixin_45459911的博客 1759

python实现6大基本排序算法

在开始今天的文章之前,我想很多小伙伴可能有一个疑惑,就是在python中我们有内置的sort和sorted函数可以快速实现排序了,为什么我们还要会用Python来编写排序算法呢?而且就算我们学会了如何用Python去编写排序算法,在真正写程序时我也不可能真的自己去编写一个排序函数然后去调用啊?

2401_83167454的博客 984
上一篇: 递归讲解与递归实现列表的反转
下一篇: ubuntu系统解决无法输入中文的问题及使用搜狗输入法配置细讲
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值