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

这篇具有很好参考价值的文章主要介绍了算法初学者指南:理解排序算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

快速理解

冒泡排序

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

算法步骤

  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 arr

arr = [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-1
        while j >=0 and key < arr[j]:
                arr[j + 1] = arr[j]
                j -= 1
        arr[j + 1] = key
    return arr

arr = [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 arr
    pivot = 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 = 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

arr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("Sorted array is:", arr)

C# 示例答案文章来源地址https://www.toymoban.com/news/detail-816475.html

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);
        }
    }
}

到了这里,关于算法初学者指南:理解排序算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark初学者指南:使用指南和示例

    本文介绍了如何使用Spark处理大规模数据集,并提供了一个Scala编写的Word Count示例,指导您从安装和配置到编写和运行Spark应用程序。无需担心,即使您是Spark初学者,也可以按照本文的步骤来学习和使用Spark。 Spark是一个流行的分布式计算框架,用于处理大规模数据集。它使

    2024年02月06日
    浏览(63)
  • systemd:初学者如何理解其中的争议

    导读 对于什么是 systemd,以及为什么它经常成为 Linux 世界争议的焦点,你可能仍然感到困惑。我将尝试用简单的语言来回答。 在 Linux 世界中,很少有争议能像传统的 System V 初始化 系统(通常称为 SysVinit)和较新的 systemd 之间的斗争那样引起如此大的争议。 在这篇文章中

    2024年02月12日
    浏览(46)
  • 【深度学习】深度强化学习初学者指南

            GAN(Generative Adversarial Networks)是一种深度学习模型,它由两个神经网络组成:一个生成网络和一个判别网络。生成网络学习如何生成类似于给定数据集的新数据,而判别网络则学习如何区分生成网络生成的数据和原始数据。这两个网络相互竞争,使得生成器越来

    2024年02月13日
    浏览(42)
  • 【深度学习】神经网络初学者指南

            这是一篇对神经网络的泛泛而谈的文章,我的意见是,先知道框架,而后知道每一个细节,这是学习人工智能的基本路线。本文就神经网络而言,谈到一些基础概念,适应于初学者建立概念。         神经网络是一组算法,以人脑为松散建模,旨在识别模式。

    2024年02月16日
    浏览(41)
  • UV贴图和展开初学者指南

    在线工具推荐: 3D数字孪生场景编辑器  -  GLTF/GLB材质纹理编辑器  -  3D模型在线转换  -  Three.js AI自动纹理开发包  -  YOLO 虚幻合成数据生成器  -  三维模型预览图生成器  -  3D模型语义搜索引擎 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建模软件在创

    2024年01月22日
    浏览(51)
  • 了解 ESP32 FreeRTOS:初学者指南

    ESP32 FreeRTOS是针对ESP32微控制器的一个实时操作系统(RTOS),它采用了FreeRTOS内核,可以帮助开发人员在ESP32芯片上进行多任务处理。简单来说,FreeRTOS提供了一种方式来管理软件任务并协调它们的执行。 ESP32是一个功能强大的嵌入式系统,可以用于构建各种物联网应用程序。

    2023年04月14日
    浏览(59)
  • Unity中Interface修饰符:初学者指南

    什么是Interface?         在Unity和其他面向对象的编程语境中, interface 是一种特殊的结构,它定义了一组方法和属性,但不提供它们的实现。在C#中, interface 是通过 interface 来声明的。它像是一个合约,规定了实现它的类必须遵循的规则。 为什么要使用Interface? 约定

    2024年01月23日
    浏览(46)
  • 2023 年如何学习 SQL:初学者终极指南

    什么是 SQL,它的用途是什么? SQL 在 2023 年仍然适用吗? 你应该学习 SQL 吗? 学习 SQL 的不同方法 SQL 入门 SQL初学者可能害怕问的问题 学习 SQL 的先决条件是什么,我需要有任何编码经验吗? SQL 有哪些实际应用,哪些行业依赖于此技能? 学习SQL需要多长时间,我应该投入多

    2024年02月03日
    浏览(104)
  • 【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

            受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种基于能量模型的人工神经网络。它只有一个隐层,将输入层和隐层中的每个神经元互相连接,但不同层的神经元之间没有连接。RBM是一种无向的概率图模型,可以用于特征提取、数据降维、协同过滤等任务。它

    2024年02月13日
    浏览(43)
  • NumPy 初学者指南中文第三版:11~14

    原文:NumPy: Beginner’s Guide - Third Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 本章适用于希望使用 NumPy 和 Pygame 快速轻松创建游戏的开发人员。 基本的游戏开发经验会有所帮助,但这不是必需的。 您将学到的东西如下: pygame 基础 matplotlib 集成 表面像素数组 人工智能 动画 OpenGL P

    2023年04月16日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包