算法初学者指南:理解排序算法

前言

        排序是计算机科学中的基本问题之一,也是数据处理的核心步骤。从最简单的个人项目到复杂的工业级应用,排序都扮演着关键角色。本文将介绍四种常见的排序算法:冒泡排序、插入排序、快速排序和堆排序,旨在帮助算法初学者理解这些基本概念。

快速理解

冒泡排序

        冒泡排序是最简单的排序算法之一,它重复遍历要排序的列表,比较相邻的元素,并将顺序错误的元素交换位置。这个过程重复进行,直到没有需要交换的元素,这时列表就排序完成了。

算法步骤

  1. 从列表的第一个元素开始,比较相邻的元素。
  2. 如果第一个元素比第二个大,就交换它们的位置。
  3. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  4. 针对所有的元素重复以上的步骤,除了最后一个。
  5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

        尽管冒泡排序很直观,但它不适合处理大数据集。它的平均和最坏情况时间复杂度均为O(n²),其中n是列表的元素数量。

插入排序

        插入排序的工作方式类似于我们排序扑克牌。在每次迭代中,插入排序从数据集中取出未排序部分的第一个元素,然后逐步将该元素移动到已排序部分的正确位置。

算法步骤

  1. 从第一个元素开始,该元素被认为已经排序。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置。
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
  5. 将新元素插入到该位置后。
  6. 重复步骤2~5。

        对于较小的数据集,插入排序效果不错,平均和最坏情况的时间复杂度同样为O(n²),但它在列表基本有序的情况下表现得尤为优秀。

快速排序

        快速排序是一种分而治之的算法,以递归方式将列表分为较小的子列表。快速排序包含了两个主要的步骤:首先,选择一个“基准”项;其次,分区操作,将比基准小的项移到基准前面,比基准大的项移到后面。

算法步骤

  1. 选择一个基准值。
  2. 分区过程中,比基准值小的移动到基准值的左边,比基准值大的移动到右边。
  3. 对左侧和右侧的两个子集,不包括基准值,重复步骤1和2。
  4. 重复步骤3,直到所有子集只剩下单个元素。

        快速排序在平均和最佳情况下的时间复杂度为O(n log n),但在最坏情况下会退化为O(n²)。不过在大多数情况下,它是非常高效的。

堆排序

        堆排序是基于二叉堆数据结构的一种比较不同的排序方法。它利用了最大堆(或最小堆)的性质来排序元素。

算法步骤

  1. 构建一个最大堆(或最小堆)。
  2. 将最大(或最小)项抽出并放置到集合的尾端。
  3. 重新调整剩余项,使其保持最大(或最小)堆的性质。
  4. 重复步骤2和3直到堆中只剩下一个元素。

        堆排序的时间复杂度在最佳、平均和最坏情况下都是O(n log n),并且它不需要额外的存储空间,这使它成为数据集较大时的一个不错的选择。

总结

        学习这些排序算法为初学者提供了一种强有力的方式来理解算法分析的基本原则。虽然冒泡排序和插入排序由于其高时间复杂度在大数据集上效率较低,但它们简单且易于实现。快速排序因为平均性能好而被广泛使用,尽管它在最坏情况下的性能不佳。堆排序则提供了一种在所有情况下都很稳定的性能的排序方法。了解各个排序算法的优势和局限性将帮助你选择最适合你当前情况的算法。

附:算法题示例

1. 冒泡排序

题目: 给定一个整数数组,使用冒泡排序算法对其进行排序。

Python 示例答案

def bubble_sort(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]return arrarr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("Sorted array is:", arr)

C# 示例答案

using System;public class BubbleSort {static void bubbleSort(int[] arr) {int n = arr.Length;for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - i - 1; j++)if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}public static void Main() {int[] arr = {64, 34, 25, 12, 22, 11, 90};bubbleSort(arr);Console.WriteLine("Sorted array:");foreach (int i in arr)Console.Write(i + " ");}
}

2. 插入排序

题目: 给定一个整数数组,使用插入排序算法对其进行排序。

Python 示例答案

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i-1while j >=0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arrarr = [12, 11, 13, 5, 6]
insertion_sort(arr)
print("Sorted array is:", arr)

C# 示例答案

using System;public class InsertionSort {static void insertionSort(int[] arr) {int n = arr.Length;for (int i = 1; i < n; ++i) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}}public static void Main() {int[] arr = {12, 11, 13, 5, 6};insertionSort(arr);Console.WriteLine("Sorted array:");foreach (int i in arr)Console.Write(i + " ");}
}

3. 快速排序

题目: 给定一个整数数组,使用快速排序算法对其进行排序。

Python 示例答案

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)arr = [3, 6, 8, 10, 1, 2, 1]
print("Sorted array is:", quick_sort(arr))

C# 示例答案

using System;
using System.Linq;public class QuickSort {public static void Main() {int[] arr = {3, 6, 8, 10, 1, 2, 1};var sortedArray = QuickSortArray(arr);Console.WriteLine("Sorted array:");foreach (int i in sortedArray)Console.Write(i + " ");}private static int[] QuickSortArray(int[] arr) {if (arr.Length <= 1)return arr;var pivot = arr[arr.Length / 2];var left = arr.Where(x => x < pivot).ToArray();var middle = arr.Where(x => x == pivot).ToArray();var right = arr.Where(x => x > pivot).ToArray();return QuickSortArray(left).Concat(middle).Concat(QuickSortArray(right)).ToArray();}
}

4. 堆排序

题目: 给定一个整数数组,使用堆排序算法对其进行排序。

Python 示例答案

def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[i] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif 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 arrarr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("Sorted array is:", arr)

C# 示例答案

using System;public class HeapSort {public static void Main() {int[] arr = {12, 11, 13, 5, 6, 7};heapSort(arr);Console.WriteLine("Sorted array:");foreach (int i in arr)Console.Write(i + " ");}static void heapSort(int[] arr) {int n = arr.Length;for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}static void heapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest])largest = left;if (right < n && arr[right] > arr[largest])largest = right;if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的&#xff1f;在一个 while 循环中 select 出事 件&#xff0c;然后依次处理每种事件。我们可以把它称为事件循环&#xff0c;这就是 EventLoop 。 interface io.netty.channel. EventLoo…

数据结构栈、队列、链表、散列表

栈&#xff08;stack&#xff09; 栈&#xff08;stack&#xff09;是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶&#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基本操作只有 push&#xf…

刷题第十六天-扰乱字符串

扰乱字符串 题目要求 解题思路 初步分析 给定两个字符串T和S&#xff0c;假设T是由S变换而来的 如果T和S长度不一样&#xff0c;必定不能变来如果长度一样&#xff0c;顶层字符串S能够划分 S 1 S_1 S1​和 S 2 S_2 S2​&#xff0c;同样字符串T也能够划分为 T 1 T_1 T1​和…

uniapp、vue、小程序常用的一些验证规则校验方法(例如:手机号。身份证、金额等)

例如&#xff1a; 检查是否为空数组 、是否是空 不为空false 为空true、校验密码、校验手机号格式、校验邮箱格式、校验身份证号格式、校验值长度 不少于6位数、 电话号码加密 15288889999 转化为 152****9999、身份证号码加密、验证输入重量、金额等类型 例如 0.11 2.23…

RT-Thread 线程间通信 信号

信号 信号&#xff08;又称为软中断信号&#xff09;&#xff0c;在软件层次上是对中断机制的一种模拟&#xff0c;在原理上&#xff0c;一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在RT-Thread中用作异步通信&#xff0c;POSIX标准…

MES系统数据采集的几种方式

生产制造执行MES系统具有能够帮助企业实现生产数据收集与分析、生产计划管理、生产过程监控等的功能板块&#xff0c;在这里小编就不一一介绍了&#xff0c;主要讲讲它的数据采集功能板块&#xff0c;可以说&#xff0c;数据采集是该系统进行数据统计与生产管理等后续工作的基础…

SpringBoot默认配置文件

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…

【每日一题】2696. 删除子串后的字符串最小长度-2024.1.10

题目&#xff1a; 2696. 删除子串后的字符串最小长度 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff0c…

如何在数学建模竞赛中稳定拿奖

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Windows 10 Manager v3.9.0.0

软件介绍 Windows 10 Manager&#xff0c;Win10优化软件&#xff0c;香港Yamicsoft 公司开发的集微软Windows10的所有功能于一身的系统优化软件&#xff0c;包含40多个实用程序来优化&#xff0c;调整&#xff0c;清理&#xff0c;加速和修复Windows 10&#xff0c;可以让系统…

函数指针和回调函数

文章目录 一.函数指针1.什么是函数指针2.函数指针的形式3.函数指针的用途。1.调用函数2.作为参数进行传递 二.函数指针数组三.回调函数 一.函数指针 1.什么是函数指针 函数指针是指向函数的指针。在C语言和C中&#xff0c;函数指针可以用来存储函数的地址&#xff0c;并且可以…

【操作系统】优化MBR程序:让MBR调用显存吧

一.显存、显卡以及显示器的概述 显卡用于连接CPU和显示器&#xff0c;我们调用显示器时&#xff0c;其实就是利用显卡提供的IO接口间接地对显示器进行操作&#xff0c;所以显卡也称之为显示适配器。接下来我们将优化之前写的MBR程序&#xff08;参考&#xff1a;【操作系统】BI…

学习python仅收藏此一篇就够了(集合,字典)

集合 集合的定义&#xff1a; 变量名称 {元素&#xff0c;元素} 变量名称 set() 首先&#xff0c;因为集合是无序的&#xff0c;所以集合不支持&#xff0c;下标索引访问。 但是集合和列表一样&#xff0c;是允许修改的。 #定义一个集合 my_set {"python", …

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

【LeetCode】2626. 数组归约运算

数组归约运算 题目题解 题目 给定一个整数数组 nums、一个 reducer 函数 fn 和一个初始值 init&#xff0c;返回通过依次对数组的每个元素执行 fn 函数得到的最终结果。 通过以下操作实现这个结果&#xff1a;val fn(init, nums[0])&#xff0c;val fn(val, nums[1])&#…

1. Presto基础

该笔记来源于网络&#xff0c;仅用于搜索学习&#xff0c;不保证所有内容正确。文章目录 一、presto基础操作二、时间函数0、当前日期/当前时间1、转时间戳1&#xff09;字符串转时间戳 &#xff08;推荐&#xff09;2&#xff09;按照format指定的格式&#xff0c;将字符串str…

AlexNet论文翻译与精读

1:该论文解决了什么问题&#xff1f; 图像分类问题 2&#xff1a;该论文的创新点&#xff1f; 1:使用了大的深的卷积神经网络进行图像分类&#xff1b; 2:采用了两块GPU进行分布式训练&#xff1b; 3:采用了Relu进行训练加速&#xff1b; 4:采用局部归一化提高模型泛化能…

Mac iTerm2 配置

Mac iTerm2 配置 安装 brew install iTerm2安装完成之后&#xff0c;需要重新打开终端&#xff0c;既可以看见安装 iTerm2 的效果。 iTerm2 美化 使用 oh-my-zsh 美化 iTerm2 终端 安装 brew install wget sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/mast…

Laravel使用Kafka实践教程(从安装到使用0-1)

一、Linux安装Kafka 首先Linux服务器需要安装好Kafka,这里不再具体细说&#xff0c;可以看我前面的文章&#xff1a;Linux搭建Kafka详细一步一步指南(linux启动kafka脚本)-CSDN博客 二、Laravel安装Kafka composer require enqueue/rdkafka:0.10.18注意&#xff1a;版本号一…

Qt 窗口阴影边框

环境&#xff1a;Qt 5.15 VS2019 方法一&#xff1a;QGraphicsDropShadowEffect 实现方法参考链接&#xff1a;https://blog.csdn.net/goforwardtostep/article/details/99549750 使用此方法添加窗口阴影&#xff0c;会出现警告信息&#xff1a; 且窗口最大化与还原切换时会…