算法-排序算法

news/2024/5/19 22:49:56 标签: 排序算法, 算法, 快速排序

一、插入排序:平均时间复杂度 O(n^2),稳定的算法
思想:2轮遍历,逐个找到<=key的位置后方插入(升序)

class Solution:
    def InsertSort(self, arr):
        n = len(arr)
        for i in range(1,n) #从第2项开始往前比较
            key = arr[i]
            j = i - 1
            #j往前遍历,找到key>= arr[j]的位置+1插入key
            while j >= 0 and key < arr[j]:
                arr[j+1] = arr[j] #未找到时均往后挪一位
                j -= 1
           arr[j+1] = key #找到时插入,未找到时,j+1=i不变
       return arr     

二、选择排序:平均时间复杂度 O(n^2),不稳定
思想:2轮遍历,每次从后序列中找到最小值交换

class Solution:
    def SelectSort(self, num):
        i, j = 0, 0
        k = 0
        for i in range(n-1):
            k = i
            Min_n = num[k]
            for j in range(i+1, n):
                if Min_n> num[j]:
                    k = j #记录最小值下标
                    Min_n = num[j]
           num[i], num[k] = num[k], num[i]        
        return num

三、冒泡排序:平均时间复杂度 O(n^2),不稳定

    def bubble_sort(self, arr):
        # 冒泡排序 、
        for i in range(len(arr) - 1):
            for j in range(len(arr) - i - 1):
                if arr[j] > arr[j+1]:
                    arr[j], arr[j+1] = arr[j+1], arr[j]
        return arr

四、快速排序:平均时间复杂度 O(nlogn),不稳定
思想:选定中心轴值,小的放左边,大的放右边。递归左右子列表
左右指针滑动时,填坑法移动。
在这里插入图片描述

class Solution:
    def MySort(self, arr: list[int]) ->list[int]:
        # write code here
        def quick_sort(arr: list[int], left, right):
            if left >= right:
                return
            p, q = left, right
            pivot = arr[left]  #取左指针为轴值
            while(p<q):
                              #此处注意等号,否则相等的时候可能陷入死循环。
                while(p<q and arr[q]>=pivot):#右指针先移动,比轴值小时停止
                    q -= 1
                arr[p] = arr[q] #填坑法,将小值放置左指针位置,重合时重复赋值
                while(p<q and arr[p]<=pivot):
                    p += 1
                arr[q] = arr[p] #将大值放置右指针位置
            arr[p] = pivot #将轴值放置重合位置
            quick_sort(arr, left, p-1)
            quick_sort(arr, p+1, right)
            return arr
        if len(arr) < 2:
            return arr
        return quick_sort(arr, 0, len(arr)-1)


if __name__ == "__main__":
    x = Solution()
    #arr = [2, 4, 1, 3, 5]
    print(x.MySort([1, 2, 3, 4, 5]))

*当数组逆序,且轴值为第一位时,时间复杂度退化成o(n^2)

五、堆排序:平均时间复杂度 O(nlogn),不稳定
堆的定义:1、完全二叉树;2、父节点值均大于子节点值(大根堆,小根堆反之)
构造堆,取堆顶值。递归实现
排序思想:在堆的基础上,迭代取堆顶值,再构造堆

def heapify(arr, n, i): #第i点构造,在第n点前。
    largest = i  
    l = 2 * i + 1     # left = 2*i + 1 算出左结点的下标
    r = 2 * i + 2     # right = 2*i + 2 右结点下标
 
    if l < n and arr[i] < arr[l]: 
        largest = l 
  
    if r < n and arr[largest] < arr[r]: 
        largest = r 
   #记录最大下标 交换     
    if largest != i: 
        arr[i],arr[largest] = arr[largest],arr[i]  # 交换 
       #交换后可能导致不满足大堆,递归
        heapify(arr, n, largest) 
  
def heapSort(arr): 
    n = len(arr) 
    # Build a maxheap. 先建立大堆。叶子节点无孩子节点比较
    # 自底而上,堆顶在arr[0]
    for i in range(n, -1, -1): 
        heapify(arr, n, i) 
  
    # 一个个交换元素排序,堆顶
    for i in range(n-1, 0, -1): 
    #从尾部开始,将堆顶最大值放到尾部。然后依次再建大堆
        arr[i], arr[0] = arr[0], arr[i]   # 交换
        heapify(arr, i, 0) #每次前i个,从堆顶再重新构造。

http://www.niftyadmin.cn/n/1525631.html

相关文章

xampp软件地址

近期在学习关于php的东西&#xff0c;发现网站最终链接到sourceforge&#xff0c;项目地址如下&#xff1a; http://sourceforge.net/projects/xampp/files

算法-动态规划-背包01、最小矩阵路径等

一、背包01 已知一个背包最多能容纳物体的体积为V 现有n个物品第i个物品的体积为vi​ 第i个物品的重量为wi​ 求当前背包最多能装多大重量的物品 输入 10,2,[[1,3],[10,4]] 输出 4 说明 第一个物品的体积为1&#xff0c;重量为3&#xff0c;第二个物品的体积为10&#xff0c;重…

notepad++项目地址

刚才我在看notepad的项目地址时&#xff0c;发现了一个问题&#xff0c;从5.9版本往后&#xff0c;在sourceforge中就没有更新了&#xff0c;本人亲自去了一下notepad的官方网站(http://notepad-plus-plus.org/)&#xff0c;下载新版的软件时发现&#xff0c;此项目现在在网站(…

算法-动态规划-最长xx子串/子序列/最大子数组累加和

最长公共子序列&#xff1a;要求不连续 最长公共子串&#xff1a;要求连续 一、最长公共子序列 定两个字符串str1和str2&#xff0c;输出连个字符串的最长公共子序列。如过最长公共子序列为空&#xff0c;则输出-1。 示例1 “1A2C3D4B56”,“B1D23CA45B6A” 输出:“123456” …

2023暑假第一次训练

1.队列安排 洛谷 P1160 队列安排 思路&#xff1a; 1.首先&#xff0c;先建一个结构体&#xff0c;分left和right&#xff0c;然后一开始只有1号&#xff0c;要设一个边界&#xff0c;表的最左边是0,最右边是100010(因为数据大不过100010)。 2.接着对于每次插入&#xff0…

算法-字符串

一、最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 解法一&#xff1a;中心扩散法 class Solution:def aroundcenter(sel…

editplus软件下载地址

刚才在下载 editplus软件&#xff0c;发现最终跳转的链接为下面的链接 https://www.editplus.com/ftp/ 刚才我把上述链接放到地址栏中enter了一下&#xff0c;发现了和apache一样的文件目录。

eclipse软件镜像地址

在eclipse官网上下载eclipse软件时&#xff0c;总是发现跳转到一些国内的高校网站&#xff0c;都是国内的一些知名高校&#xff0c;我刚才下载了一下文件&#xff0c;最终下载地址跳转到了中国科学技术大学的镜像站点上&#xff0c;链接如下&#xff1a; http://mirrors.ustc.…