排序算法(2)

news/2024/10/9 15:20:04/

文章目录

  • 概要
  • 原理及实现
    • 归并排序
      • 定义
      • 性能
      • 代码Python
    • 快速排序
      • 定义
      • 代码
  • 小结

概要

接上回

在上篇说过经典的算法>排序算法,有冒泡,插入,选择;归并,快排。其中讲了冒泡,插入,选择;这一回写归并和快排。

原理及实现

原理是很好玩的,如果不喜欢,先记住,总有一天会用得上的。

原理挺有意思的,喜欢就去研究,不喜欢就记住一些常用的,以备不时之需。先聊聊归并吧。

归并排序

本来想找个定义,看了下维基百科,也不是很满意的概念,如下:

定义

归并排序(英语:Merge sort,或mergesort),是建立在归并操作上的一种有效的算法>排序算法,效率为𝑂(𝑛log𝑛)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
定义是这样的,怎么理解呢?采用分治递归,意思就是先平均分成2份,然后比较排序;递归这种操作,就是将2份中任何一份继续采用分治法(分治法这里不细聊,以后会写文章的),分成2份,直到不能再分为止;

性能

  1. 归并排序是稳定的算法>排序算法;数组长度就那么长,一直在分割,然后继续分割直到不能再分,然后采用合并数组;
  2. 时间复杂度:O(nlogn)
  3. 空间复杂度:O(nlogn)

代码Python

dfrom typing import Listdef merge_sort(a: List[int]):merge_sort_between(a, 0, len(a) - 1)def merge_sort_between(a: List[int], low: int, high: int):# The indices are inclusive for both low and high.if low < high:mid = low + (high - low) // 2merge_sort_between(a, low, mid)merge_sort_between(a, mid + 1, high)merge(a, low, mid, high)def merge(a: List[int], low: int, mid: int, high: int):# a[low:mid], a[mid+1, high] are sorted.i, j = low, mid + 1tmp = []while i <= mid and j <= high:if a[i] <= a[j]:tmp.append(a[i])i += 1else:tmp.append(a[j])j += 1start = i if i <= mid else jend = mid if i <= mid else hightmp.extend(a[start:end + 1])a[low:high + 1] = tmp

快速排序

归并说完了,来看看快排。定义如下:

定义

快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),是一种算法>排序算法,最早由东尼·霍尔提出。在平均状况下,排序𝑛个项目要𝑂(𝑛log𝑛)(大O符号)次比较。在最坏状况下则需要𝑂( n 2 n^2 n2)次比较,但这种状况并不常见。事实上,快速排序Θ(𝑛log𝑛)通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。
按照定义,对一定长度的数据,选一个基准值,然后所有数据一个一个跟基准值比较,然后交互i,j的位置。还是分治和递归的思想,一直这么分,partion。
接下来看看代码,如下:

代码

from typing import List
import randomdef quick_sort(a: List[int]):quick_sort_between(a, 0, len(a) - 1)def quick_sort_between(a: List[int], low: int, high: int):if low < high:# get a random position as the pivotk = random.randint(low, high)a[low], a[k] = a[k], a[low]m = partition(a, low, high)  # a[m] is in final positionquick_sort_between(a, low, m - 1)quick_sort_between(a, m + 1, high)def partition(a: List[int], low: int, high: int):pivot, j = a[low], lowfor i in range(low + 1, high + 1):if a[i] <= pivot:j += 1a[j], a[i] = a[i], a[j]  # swapa[low], a[j] = a[j], a[low]return j

小结

学习总结

归并,排序都采用了分治的思想。时间复杂度归并O(nlogn),空间复杂度归并的比较大,达到O(n);快排时间复杂度O(nlogn),快排极端情况达到O( n 2 n^2 n2),但是概率很小,而且可以通过合理的选用基准值来避免,适用范围较广。


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

相关文章

【ARM Cache 系列文章 11 -- ARM Cache 直接映射 详细介绍】

请阅读【ARM Cache 系列文章专栏导读】 文章目录 ARM Cache组织形式直接映射(Direct Mapped)直接映射示例直接映射原理Cache颠簸(cache thrashing)原因文章:【ARM Cache 系列文章 11.1 – ARM Cache 全相连 详细介绍】 文章:【ARM Cache 系列文章 11.2 – ARM Cache 组相…

ArrayList知识点详解

目录 1.简介 2.ArrayList的使用 &#xff08;1&#xff09;如何实例化ArrayList&#xff1f;&#xff08;如何创建&#xff1f;&#xff09; &#xff08;2&#xff09;如何构造使用&#xff1f; &#xff08;3&#xff09;为什么ArrayList的无参构造可以添加数据 &#…

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 近些年&…

【机器学习】CLIP模型在有限计算资源下的性能探究:从数据、架构到训练策略

CLIP模型在有限计算资源下的性能探究&#xff1a;从数据、架构到训练策略 一、数据&#xff1a;质量胜过数量&#xff0c;小规模亦可制胜三、训练策略&#xff1a;选择合适的方法以应对计算资源的挑战 在人工智能领域&#xff0c;多模态模型正逐渐成为研究的热点。其中&#xf…

C#开发-nullable类型的比较

C#天然支持nullable类型。很多类除了可以有值以外&#xff0c;还可以为null。这时候我们就有疑问了&#xff0c;如果nullable类型的值为null&#xff0c;它和有值的比较结果是什么&#xff1f;它和同样为null的变量比较结果是什么&#xff1f;我现在就来解答。 测试环境是.NET…

Java:Thread类及常见方法大全(画图+源码详解)

Thread 类是 JVM 用来管理线程的一个类&#xff0c;每一个线程都有一个唯一的 Thread 类与之关联。Java中通常使用 Thread类来进行线程调度&#xff0c;线程管理。 目录 一、Thread 的常见构造方法 二、Thread 的几个常见属性 理解线程是否存活&#xff1a; 理解前台线程与…

C语言-单链表和双链表

C语言-单链表和双链表 单链表 // 定义单链表结点结构体 typedef struct Node {int data; // 数据域struct Node* next; // 指针域&#xff0c;指向下一个结点 } ListNode;// 创建新结点 ListNode* createNode(int data) {ListNode* newNode (ListNode*)malloc(sizeof(ListNo…