10大排序总结

devtools/2024/11/26 13:03:35/

1. 冒泡排序 (Bubble Sort)

def bubble_sort(arr):n = len(arr)# 遍历数组中的每个元素for i in range(n):# 内层循环,从数组的第一个元素到倒数第 i + 1 个元素for j in range(0, n - i - 1):# 如果当前元素比下一个元素大,则交换if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arr

2. 选择排序 (Selection Sort)

def selection_sort(arr):n = len(arr)# 遍历数组中的每个元素for i in range(n):# 假设当前元素是最小值min_idx = i# 通过内层循环找到最小值的索引for j in range(i + 1, n):if arr[j] < arr[min_idx]:min_idx = j# 交换当前元素和找到的最小值arr[i], arr[min_idx] = arr[min_idx], arr[i]return arr

3. 插入排序 (Insertion Sort)

def insertion_sort(arr):# 从第二个元素开始遍历数组for i in range(1, len(arr)):key = arr[i]j = i - 1# 将当前元素插入到已排序部分的正确位置while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr

4. 归并排序 (Merge Sort)

def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2  # 找到数组的中间点L = arr[:mid]        # 将数组分成两部分R = arr[mid:]merge_sort(L)  # 递归排序左半部分merge_sort(R)  # 递归排序右半部分i = j = k = 0# 合并两个已排序的子数组while i < len(L) and j < len(R):if L[i] < R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1# 检查是否还有剩余的元素while i < len(L):arr[k] = L[i]i += 1k += 1while j < len(R):arr[k] = R[j]j += 1k += 1return arr

5. 快速排序 (Quick Sort)

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]  # 选择数组的中间元素作为基准left = [x for x in arr if x < pivot]  # 所有小于基准的元素middle = [x for x in arr if x == pivot]  # 所有等于基准的元素right = [x for x in arr if x > pivot]  # 所有大于基准的元素return quick_sort(left) + middle + quick_sort(right)

6. 堆排序 (Heap Sort)

def heapify(arr, n, i):largest = i  # 假设当前节点是最大值l = 2 * i + 1  # 左子节点r = 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 heap_sort(arr):n = len(arr)# 构建最大堆for i in range(n // 2 - 1, -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)return arr

7. 希尔排序 (Shell Sort)

def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = i# 插入排序while j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2return arr

8. 计数排序 (Counting Sort)

def counting_sort(arr):max_val = max(arr)m = max_val + 1count = [0] * m# 统计每个元素的个数for a in arr:count[a] += 1i = 0for a in range(m):for c in range(count[a]):arr[i] = ai += 1return arr

9. 基数排序 (Radix Sort)

def counting_sort_for_radix(arr, exp):n = len(arr)output = [0] * ncount = [0] * 10# 统计每个基数的个数for i in range(n):index = arr[i] // expcount[index % 10] += 1for i in range(1, 10):count[i] += count[i - 1]i = n - 1while i >= 0:index = arr[i] // expoutput[count[index % 10] - 1] = arr[i]count[index % 10] -= 1i -= 1for i in range(n):arr[i] = output[i]def radix_sort(arr):max_val = max(arr)exp = 1while max_val // exp > 0:counting_sort_for_radix(arr, exp)exp *= 10return arr

10. 桶排序 (Bucket Sort)

def bucket_sort(arr):if len(arr) == 0:return arrbucket = []slot_num = 10  # 桶的数量for i in range(slot_num):bucket.append([])# 将元素分配到不同的桶中for j in arr:index = int(slot_num * j)bucket[index].append(j)# 对每个桶中的元素进行排序for i in range(slot_num):bucket[i] = insertion_sort(bucket[i])k = 0for i in range(slot_num):for j in range(len(bucket[i])):arr[k] = bucket[i][j]k += 1return arr

11. Tim Sort (Tim Sort)

MIN_MERGE = 32def calc_min_run(n):r = 0while n >= MIN_MERGE:r |= n & 1n >>= 1return n + rdef insertion_sort_for_timsort(arr, left, right):for i in range(left + 1, right + 1):temp = arr[i]j = i - 1while j >= left and arr[j] > temp:arr[j + 1] = arr[j]j -= 1arr[j + 1] = tempdef merge_for_timsort(arr, l, m, r):len1, len2 = m - l + 1, r - mleft, right = [], []for i in range(0, len1):left.append(arr[l + i])for i in range(0, len2):right.append(arr[m + 1 + i])i, j,

http://www.ppmy.cn/devtools/137121.html

相关文章

CVE-2022-4230

打开什么都没有 使用dirsearch扫描到一个wp-admin 访问wp-admin是一个登陆页面 账号密码都在标题中 登陆后是这个页面 在WP Statistics < 13.2.9 – 经过身份验证的 SQLi |CVE 2022-4230 |插件漏洞 (wpscan.com)中&#xff0c;里边有一段对漏洞的描述。 https://wpscan.com…

活着就好20241126

今天是26号&#xff0c;周二&#xff0c;一个延续新开始并蓄积力量的日子。亲爱的朋友们&#xff0c;大家早上好&#xff01;在度过了一个充满活力与重启的周一后&#xff0c;我们踏入了又一个充满挑战与机遇的工作日。周二&#xff0c;作为新一周的深入阶段&#xff0c;是我们…

spring(四) aop

aop自定义配置 aop利用了spring的自定义标签 http\://www.springframework.org/schema/aoporg.springframework.aop.config.AopNamespaceHandler在bean的配置文件中只要找到了aop命名空间对应的标签&#xff0c;就会通过AopNamespaceHandler进行解析。 Overridepublic void i…

Python双向链表、循环链表、栈

一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发&#xff0c;单向的访问后继节点&#xff0c;每个节点只能记录其后继节点的信息&#xff08;位置&#xff09;&#xff0c;不能向前遍历。 所以引入双向链表&#xff0c;双…

浅谈网络 | 传输层之套接字Socket

目录 基于 TCP 协议的 Socket 程序调用过程基于 UDP 协议的 Socket 程序函数调用过程服务器如何接入更多的项目构建高并发服务端&#xff1a;从多进程到 IO 多路复用 在前面&#xff0c;我们已经介绍了 TCP 和 UDP 协议&#xff0c;但还没有实践过。接下来这一节&#xff0c;我…

10 —— Webpack打包模式

开发模式&#xff1a;development &#xff1b;场景&#xff1a;本地开发 生产模式&#xff1a;production &#xff1b; 场景&#xff1a;打包上线 这两种模式如何设置给webpack&#xff1a; 方式1.webpack.config.js 配置文件设置mode选项 module.exports { mode:produc…

计算机网络谢希仁第七章课后题【背诵版本】

目录 【7-01】计算机网络都面临哪几种威胁?主动攻击和被动攻击的区别是什么?对于计算机网络的安全措施都有哪些? 【7-02】 试解释以下名词:(2)拒绝服务;(3)访问控制;(4)流量分析;(5)恶意程序。 【7-03】为什么说&#xff0c;计算机网络的安全不仅仅局限于保密性?试举例说…

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%&#xff0c;这个数字越小越透明(尽量别低于50%&#xff0c;不信你试试看)&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…