【Leetcode】八大排序

news/2025/1/15 17:16:03/
总述

插入排序:直接插入排序;希尔排序;

选择排序:简单选择排序;堆排序;

交换排序:冒泡排序;快速排序;

归并排序;

桶排序/基数排序;

 直接插入排序

选取未排序区域的第一个元素,从后至前逐个与已排序区域的元素两两比较,若arr[i-1]>arr[i](前者大),交换arr[i-1]和arr[i],i-=1;需要保证已排序区域再加入这个元素后仍然有序——打扑克;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def insertion_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):cur_index = iwhile cur_index-1 >= 0 and arr[cur_index-1] > arr[cur_index]:arr[cur_index], arr[cur_index-1] = arr[cur_index-1], arr[cur_index]cur_index -= 1return arr
希尔排序-缩小增量排序

通过比较一定间隔的元素进行插入排序,同时不断缩小间隔(增量),直到比较相邻元素。当增量为0时,算法终止。

时间复杂度:依赖于gap的选择,平均复杂度O(n^1.5)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def shell_sort(arr):n = len(arr) gap = n // 2while gap>0:for i in range(gap, n):while i-gap >= 0 and arr[i-gap]>arr[i]:arr[i], arr[i-gap] = arr[i-gap], arr[i]i -= gapgap = gap // 2return arr
选择排序

搜索未排序区域的最小值(最大值),将其交换到已排序区域的末尾,然后扩大已排序范围,直至得到升序(降序)排列;

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

空间复杂度:O(1)--原地实现

稳定性:不稳定

def select_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):min_index = ifor j in range(i+1, length):if arr[min_index] > arr[j]:min_index = jif min_index != i:arr[min_index], arr[i] = arr[i], arr[min_index]
 堆排序

 通过数据上浮构造初始大根堆,然后将最大值与最后一个数交换,通过数据下沉恢复除最后一个节点的大根堆,实现倒序构造升序数组;

时间复杂度:O(nlogn)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def heapify(arr, index, end):while True:left, right = 2*idx+1, 2*idx+2if right < end: cur = left if nums[left]>nums[right] else rightelif left < end: cur = leftelse: breakif nums[cur]>nums[idx]:nums[cur], nums[idx] = nums[idx], nums[cur]idx = curelse:breakreturndef heap_sort(arr):n = len(arr)for i in range(n//2, -1, -1):heapify(arr, i, n)for i in range(n-1, 0, -1):arr[0], arr[i] = arr[i], arr[0]heapify(arr, 0, i)   # 调整边界return arr
冒泡排序

对未排序区域的元素两两比较,将较大值(较小值)向后交换,然后缩小未排序范围,直至未排序范围清空时得到升序(降序)排列;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def bubble_sort(arr):length = len(arr)if length <= 1:returnfor i in range(length):is_made_swap = False               # 设置标志位for j in range(length - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]is_made_swap = Trueif not is_made_swap: break         # 无交换代表已经有序
快速排序

step1.从数列中挑出一个元素,称为"基准"(pivot),
step2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
step3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

时间复杂度:最优O(nlogn)--每次接近二分  最坏O(n^2)--每次只分出一个

空间复杂度:O(logn)

稳定性:不稳定

def partition(nums, left, right):pivot = nums[left]                 #初始化一个待比较数据i,j = left, rightwhile i<j:while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数j-=1nums[i] = nums[j]              #将更小的数放入左边while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数i+=1nums[j] = nums[i]              #将更大的数放入右边nums[i] = pivot                    #待比较数据放入最终位置 return i                           #返回待比较数据最终位置def quicksort(nums, left, right):if left < right:index = partition(nums, left, right)quicksort(nums, left, index-1)quicksort(nums, index+1, right)
归并排序

把长度为n的输入序列分成两个长度为n/2的子序列,在子序列中也采用归并排序;当子序列中排序完成后,将其合并;

时间复杂度:最优O(n)   最坏O(nlogn)

空间复杂度:O(n)

稳定性:不稳定

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2    left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)   def merge(left, right):new = []i = j = k = 0while(i < len(left) and j < len(right)):if left[i] < right[j]:new.append(left[i])i += 1else:new.append(right[j])j += 1new = new + left[i:] + right[j:]return new
 桶排序/基数排序

将数据按位进行分桶,按桶代表的数值进行排序,然后切换到下一个位;

def radix_sort(arr):max_num = max(arr)place = 1while max_num >= 10**place:  # 统计最大值的位数place += 1for i in range(place):buckets = [[] for _ in range(10)]for num in array:radix = int(num/(10**i) % 10)buckets[radix].append(num)j = 0for k in range(10):for num in buckets[k]:arr[j] = numj += 1return arr

备注:

冒泡排序和选择排序大体思路一致,区别在于冒泡是通过交换都得到未排序区域的最值,而选择只记录了对应下标;冒泡的有序区域在列表末尾,选择的有序区域在列表开头(这个也可换);冒泡比较出相对关系,可在满足要求时提前结束排序,而选择无法优化;


http://www.ppmy.cn/news/1461588.html

相关文章

在Windows环境下安装CPU版的PyTorch

PytTorch是基于Python开发的&#xff0c;首先需要安装Python&#xff0c;Python的安装很简单&#xff0c;这里不再赘述。而 Windows用户能直接通过conda、pip和源码编译三种方式来安装PyTorch。 打开PyTorch官网&#xff08;PyTorch&#xff09;&#xff0c;在主页中根据自己的…

证照之星是什么软件 证照之星哪个版本好用?证照之星支持哪些相机 证照之星XE免费版

许多人都需要使用证件照&#xff0c;为了满足这一需求&#xff0c;人们会使用照相机、手机、电脑等工具进行拍摄。除此之外&#xff0c;市面上还存在专门的证件照拍摄软件&#xff0c;比如证照之星。那么&#xff0c;各位小伙伴是否了解证照之星哪个版本好用&#xff0c;证照之…

5.9网络协议

由网卡发送数据通过网线进行发送&#xff0c;当网卡接收到信号以后将数据传给内核数据区&#xff0c;然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现&#xff0c;这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

数据结构复习指导之图的存储及基本操作

文章目录 图的存储及基本操作 考纲内容 复习提示 1.邻接矩阵法 2.邻接表法 3.十字链表 4.邻接多重表 5.图的基本操作 图的存储及基本操作 图的存储必须要完整、准确地反映顶点集和边集的信息。根据不同图的结构和算法&#xff0c;采用不同的存储方式将对程序的效率产生…

鸿蒙ArkUI-X跨平台开发电商应用

一、ArkUI-X 简介 ArkUI-X 是由 OpenHarmony TSC - 跨平台应用开发框架 TSG 所孵化的开源项目,使用ArkUI-X可以让开发者基于一套主代码, 就可以构建支持多平台的精美、高性能应用。目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。 ArKUI跨平台…

B/S和C/S框架

一、B/S框架 B/S框架是指Browser/Server框架&#xff0c;即基于浏览器和服务器的应用程序开发框架。在B/S架构中&#xff0c;用户通过浏览器&#xff08;Browser&#xff09;访问服务器&#xff08;Server&#xff09;上的应用程序或网站&#xff0c;而无需在用户端安装额外的客…

QT部分学习笔记

文章目录 1.前言注意问题2.学习历程2.0 创建项目 快捷键&#xff1a;2.1 创建按钮2.2 对象树2.3 调试输出2.4 QT坐标系2.5 信号和槽 3.Qmainwindow3.1 窗口菜单栏创建3.2 工具栏3.3 状态栏3.4 铆接部件3.5 对话框 4. 1.前言 版本&#xff1a; 5.9.9 注意问题 Qstring类型通多…

[晕事]今天做了件晕事33 c++ mangle 函数名

作为一名c的程序员&#xff0c;开始使用c的时候&#xff0c;如果工程里同时有c和c&#xff0c;而且函数相互调用。 这个时候&#xff0c;需要注意&#xff0c; https://mzhan017.blog.csdn.net/article/details/121950739。 这个最好是在提示的时候&#xff0c;直接按照mangle…