【JAVA-Day31】深入解析冒泡、选择和插入排序在数组排序中的应用

news2024/9/27 9:23:14

深入解析冒泡、选择和插入排序在数组排序中的应用

  • 深入解析冒泡、选择和插入排序在数组排序中的应用
    • 摘要
    • 引言
    • 冒泡排序:基本原理和应用场景
      • 冒泡排序算法的工作原理
      • 什么情况下选择冒泡排序
      • 冒泡排序的时间复杂度和空间复杂度
    • 选择排序:精确排序策略和最佳实践
      • 选择排序算法的核心思想
      • 何时选择选择排序
      • 选择排序的性能和效率分析
    • 插入排序:高效插入数据的方法
      • 插入排序的运作方式
      • 在哪些情况下使用插入排序
      • 插入排序与部分有序数据的关系
    • 性能比较和实际应用案例
      • 冒泡、选择和插入排序的性能对比
      • 实际应用中的排序算法选择
      • 使用示例:如何在特定场景中应用这些排序算法
        • 场景一:小型数据集排序
        • 场景二:大规模数据集排序
    • 优化和改进
      • 优化冒泡、选择和插入排序的方法
        • 冒泡排序的优化
        • 选择排序的优化
        • 插入排序的优化
      • 高级排序算法与传统算法的比较
      • 如何选择最适合您需求的排序算法
    • 未来趋势:现代排序算法
      • 现代计算领域中的排序算法
      • 基于硬件和多核处理器的排序优化
      • 分布式系统中的排序挑战和解决方案
    • 总结
    • 参考资料

在这里插入图片描述
在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


深入解析冒泡、选择和插入排序在数组排序中的应用

摘要

在计算机科学和算法领域,排序是一个重要而广泛应用的问题。本博文将深入研究冒泡排序、选择排序和插入排序这三种经典的排序算法,并探讨它们在不同应用场景中的应用。我们将分析它们的工作原理、性能特点以及如何在实际项目中选择合适的排序算法。同时,我们也会介绍一些优化和改进方法,以及未来趋势中的现代排序算法。

引言

排序是计算机科学中的一个基本问题,涉及将一组元素按照某种规则重新排列,以满足特定的需求。排序算法的选择在很大程度上取决于数据的规模、性质和使用场景。冒泡排序、选择排序和插入排序是最简单的排序算法之一,它们具有直观的实现方式,但也有一定的性能局限性。在本文中,我们将深入研究这些排序算法,了解它们的工作原理、应用场景、性能分析以及如何进行优化和改进。

冒泡排序:基本原理和应用场景

冒泡排序算法的工作原理

冒泡排序是一种简单的比较排序算法,它重复地遍历待排序的元素列表,依次比较相邻的两个元素,并将它们交换位置,直到整个列表排序完成。它的核心思想是将较大的元素逐渐“冒泡”到列表的末尾。

什么情况下选择冒泡排序

冒泡排序适用于以下情况:

  • 数据规模较小:当数据规模相对较小时,冒泡排序的性能损耗较小。
  • 数据大部分已经有序:如果列表已经接近有序,冒泡排序的性能会比较好。

冒泡排序的时间复杂度和空间复杂度

冒泡排序的时间复杂度为O(n^2),其中n是待排序元素的数量。它的空间复杂度为O(1),因为它只需要少量额外的空间来存储临时变量。

冒泡排序是一个非常基础但重要的排序算法,让我们通过示例代码来演示其工作原理以及如何在Java中实现它。

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};

        System.out.println("原始数组:");
        printArray(arr);

        bubbleSort(arr);

        System.out.println("排序后的数组:");
        printArray(arr);
    }

    // 冒泡排序函数
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;
        
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换arr[j]和arr[j + 1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }

            // 如果没有发生交换,说明数组已经有序
            if (!swapped) {
                break;
            }
        }
    }

    // 打印数组
    public static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

在这段示例代码中,我们首先定义了一个包含整数的数组。然后,我们调用了bubbleSort函数来对这个数组进行冒泡排序。冒泡排序的关键在于不断比较相邻的元素,如果发现逆序(即前一个元素大于后一个元素),则交换它们,直到整个数组排序完成。

冒泡排序的优点是它是稳定的排序算法,而且在空间复杂度上非常高效,因为它只需要少量额外的空间来存储临时变量。然而,它的时间复杂度为O(n^2),因此对于大规模数据集来说,性能可能会较差。当数据规模较小或数据已经接近有序时,冒泡排序仍然是一个不错的选择。

选择排序:精确排序策略和最佳实践

选择排序算法的核心思想

选择排序是一种简单但低效的排序算法。它的工作原理是找到待排序列表中的最小元素,将其放在已排序部分的末尾,然后继续在剩余元素中寻找最小元素并重复这个过程,直到整个列表排序完成。

何时选择选择排序

选择排序适用于以下情况:

  • 数据规模较小:与冒泡排序类似,当数据规模相对较小时,选择排序的性能损耗较小。
  • 简单性要求:选择排序是一种简单的排序算法,适用于对算法的复杂性要求不高的场景。

选择排序的性能和效率分析

选择排序的时间复杂度为O(n^2),与冒泡排序相似,但由于减少了元素交换的次数,通常比冒泡排序稍微快一些。它的空间复杂度为O(1)。

选择排序是一个简单但不太高效的排序算法,让我们通过示例代码来演示其工作原理以及如何在Java中实现它。

public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};

        System.out.println("原始数组:");
        printArray(arr);

        selectionSort(arr);

        System.out.println("排序后的数组:");
        printArray(arr);
    }

    // 选择排序函数
    public static void selectionSort(int[] arr) {
        int n = arr.length;
        
        for (int i = 0; i < n - 1; i++) {
            // 假设当前元素为最小值
            int minIndex = i;
            
            for (int j = i + 1; j < n; j++) {
                // 找到更小的元素,更新最小值索引
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            
            // 将最小值与当前元素交换位置
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    // 打印数组
    public static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

在这段示例代码中,我们首先定义了一个包含整数的数组。然后,我们调用了selectionSort函数来对这个数组进行选择排序。选择排序的核心思想是不断找到未排序部分的最小元素,然后将其放在已排序部分的末尾。

选择排序的优点是它是不稳定排序算法,但是在空间复杂度上非常高效,因为它只需要少量额外的空间来存储临时变量。然而,它的时间复杂度也为O(n^2),与冒泡排序相似,因此在大规模数据集上性能可能较差。

插入排序:高效插入数据的方法

插入排序的运作方式

插入排序是一种简单但高效的排序算法。它的核心思想是将待排序的元素逐个插入到已排序部分的正确位置。具体做法是,从未排序部分取出一个元素,与已排序部分的元素逐个比较,找到合适的位置插入。

在哪些情况下使用插入排序

插入排序适用于以下情况:

  • 数据规模较小:插入排序在处理小型数据集时效率较高。
  • 数据大部分已经有序:如果大部分数据已经有序,插入排序的性能非常好。

插入排序与部分有序数据的关系

插入排序在处理部分有序数据时表现出色。对于近乎有序的数据集,插入排序的时间复杂度接近O(n)。

插入排序是一个简单但高效的排序算法,让我们通过示例代码来演示其工作原理以及如何在Java中实现它。

public class InsertionSort {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};

        System.out.println("原始数组:");
        printArray(arr);

        insertionSort(arr);

        System.out.println("排序后的数组:");
        printArray(arr);
    }

    // 插入排序函数
    public static void insertionSort(int[] arr) {
        int n = arr.length;
        
        for (int i = 1; i < n; i++) {
            int key = arr[i];
            int j = i - 1;

            // 将大于key的元素向后移动
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            
            // 插入key到正确位置
            arr[j + 1] = key;
        }
    }

    // 打印数组
    public static void printArray(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

在这段示例代码中,我们首先定义了一个包含整数的数组。然后,我们调用了insertionSort函数来对这个数组进行插入排序。插入排序的核心思想是将待排序的元素逐个插入到已排序部分的正确位置。

插入排序的优点是它是稳定的排序算法,并且在数据规模较小或数据大部分已经有序的情况下,性能表现出色。与冒泡排序和选择排序相比,插入排序的时间复杂度也为O(n^2),但在某些情况下可能更快。

性能比较和实际应用案例

冒泡、选择和插入排序的性能对比

首先,让我们比较冒泡、选择和插入排序的性能。这里我们主要关注它们的时间复杂度和空间复杂度。

  • 冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
  • 选择排序的时间复杂度也为O(n^2),空间复杂度为O(1)。
  • 插入排序的平均时间复杂度为O(n^2),但在某些特定情况下(如数据大部分已经有序),性能可能更好。空间复杂度为O(1)。

从时间复杂度的角度看,这三种排序算法在大规模数据集上的性能都相对较差,因为它们都具有二次复杂度。但从空间复杂度的角度来看,它们都非常高效,因为它们只需要少量额外的空间。

实际应用中的排序算法选择

在实际项目中,选择合适的排序算法非常重要。以下是一些指导原则:

  • 如果数据规模较小,不要太担心性能问题,可以选择任何一种排序算法。但插入排序通常在这种情况下表现较好,因为它对小规模数据集的性能有良好的表现。
  • 如果数据集已经接近有序,插入排序是一个不错的选择,因为它在这种情况下性能非常出色。
  • 如果数据规模较大,并且性能是首要考虑因素,那么应该考虑使用更高效的排序算法,如快速排序、归并排序或堆排序。这些算法的平均时间复杂度为O(n log n),在大规模数据集上表现出色。

使用示例:如何在特定场景中应用这些排序算法

让我们通过示例来演示如何在特定场景中应用这些排序算法。

场景一:小型数据集排序

假设你有一个包含100个整数的小型数据集需要排序。由于数据规模较小,你可以选择使用插入排序,因为它对小规模数据表现良好且实现简单。

int[] arr = { /* 100个整数 */ };
insertionSort(arr);
场景二:大规模数据集排序

现在,假设你需要对包含100,000个整数的大规模数据集进行排序。在这种情况下,选择排序和冒泡排序性能可能太差,不适合使用。你可以考虑使用更高效的排序算法,如快速排序。

int[] arr = { /* 100,000个整数 */ };
quickSort(arr, 0, arr.length - 1);

通过以上示例,我们可以看到在不同的场景中选择不同的排序算法是有道理的。根据数据的规模、有序程度以及性能需求,选择最合适的排序算法可以提高程序的效率。

优化和改进

在这一部分,我们将深入讨论如何优化和改进冒泡、选择和插入排序这些传统排序算法,以及与现代高级排序算法的比较。

优化冒泡、选择和插入排序的方法

冒泡排序的优化

冒泡排序的主要优化方法是引入一个标志位,记录每轮是否发生了元素交换。如果某一轮没有发生交换,说明列表已经有序,可以提前结束排序。这个优化可以显著减少冒泡排序在某些情况下的冗余操作。

boolean swapped;
for (int i = 0; i < n - 1; i++) {
    swapped = false;
    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;
            swapped = true;
        }
    }
    // 如果没有发生交换,提前结束
    if (!swapped) {
        break;
    }
}
选择排序的优化

选择排序的一个明显优化是减少元素交换的次数。在每一轮内,不仅要找到最小元素的索引,还可以同时找到最大元素的索引,然后进行一次交换。这样可以减半元素交换的次数。

for (int i = 0; i < n / 2; i++) {
    int minIndex = i;
    int maxIndex = i;
    for (int j = i + 1; j < n - i; j++) {
        if (arr[j] < arr[minIndex]) {
            minIndex = j;
        } else if (arr[j] > arr[maxIndex]) {
            maxIndex = j;
        }
    }
    // 交换最小元素和最大元素
    int tempMin = arr[minIndex];
    int tempMax = arr[maxIndex];
    arr[minIndex] = arr[i];
    arr[maxIndex] = arr[n - i - 1];
    arr[i] = tempMin;
    arr[n - i - 1] = tempMax;
}
插入排序的优化

插入排序的优化方法之一是使用二分查找来找到插入位置,而不是逐个比较。这可以显著减少比较操作的次数,尤其在数据集较大时效果明显。

public static void insertionSort(int[] arr) {
    int n = arr.length;

    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int left = 0;
        int right = i - 1;

        // 使用二分查找找到插入位置
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (key < arr[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        // 移动元素,插入到正确位置
        for (int j = i - 1; j >= left; j--) {
            arr[j + 1] = arr[j];
        }
        arr[left] = key;
    }
}

高级排序算法与传统算法的比较

传统排序算法如冒泡、选择和插入排序在某些情况下性能较差,特别是在大规模数据集上。现代计算领域涌现了许多高级排序算法,其中一些包括快速排序、归并排序、堆排序等。

  • 快速排序(Quick Sort):快速排序是一种高效的分治排序算法,其平均时间复杂度为O(n log n)。它通常优于传统排序算法,并在大规模数据集上表现出色。
  • 归并排序(Merge Sort):归并排序也是一种分治排序算法,具有稳定的性能和O(n log n)的平均时间复杂度。它的优点之一是在外部排序中非常有用。
  • 堆排序(Heap Sort):堆排序是一种选择排序的变种,具有O(n log n)的时间复杂度。它的特点是在堆数据结构上进行排序,适用于大规模数据。

这些高级排序算法通常在大规模数据处理、数据库管理、搜索引擎等领域得到广泛应用。

如何选择最适合您需求的排序算法

最后,如何选择最适合您需求的排序算法取决于多个因素:

  • 数据规模:如果数据规模较小,传统排序算法如插入排序可能足够。对于大规模数据,考虑使用高级排序算法。
  • 数据性质:数据的有序程度、分布情况等都会影响排序算法的性能。近似有序的数据集可能适合插入排序,随机数据可能需要快速排序。
  • 性能需求:如果对性能要求较高,应选择平均时间复杂度较低的排序算法。在特定场景下,如实时系统,性能是至关重要的。
  • 稳定性:某些应用要求排序算法具有稳定性,即保持相等元素的相对顺序。归并排序是一种稳定的排序算法。
  • 实现复杂度:考虑算法的实现复杂度和可维护性。有些高级排序算法可能需要更多的代码和理解。

综合考虑这些因素,您可以选择最适合您特定需求的排序算法。在实践中,了解多种排序算法并根据情况选择合适的算法是非常重要的技能。

未来趋势:现代排序算法

现代计算领域中的排序算法

现代计算领域出现了许多新的排序算法,它们利用了硬件和多核处理器的性能优势,以实现更快的排序。我们将简要介绍一些现代排序算法的特点和应用。

基于硬件和多核处理器的排序优化

随着计算硬件的发展,排序算法也得到了新的优化。我们将讨论一些基于硬件和多核处理器的排序优化技术,以提高排序的效率。

分布式系统中的排序挑战和解决方案

在分布式系统中,排序算法面临更大的挑战,需要处理大规模的数据和分布式计算。我们将探讨在分布式环境中排序的挑战,并介绍一些解决方案和分布式排序算法。

通过深入研究和比较这些排序算法,本文将帮助读者更好地理解它们的工作原理和应用场景,以及如何在实际项目中选择和优化排序算法。同时,我们也将展望未来,介绍一些现代排序算法和排序在新兴领域中的发展趋势。希望本文能够为读者提供有关排序算法的全面知识,并帮助他们在实践中取得更好的效果。

总结

本文深入探讨了冒泡排序、选择排序和插入排序这三种传统的排序算法,以及如何优化和改进它们的性能。我们了解了这些排序算法的工作原理、适用场景、时间复杂度和空间复杂度,并提供了优化方法,使它们在实际应用中更具竞争力。

此外,我们还比较了传统排序算法与现代排序算法的性能和应用领域。现代排序算法借助硬件和多核处理器的优势,提供了更高效的排序解决方案。同时,分布式系统中的排序也面临挑战,但有一些解决方案可以应用。

最后,我们强调了选择适合特定需求的排序算法的重要性。根据数据规模、性质、性能要求和实现复杂度等因素,选择合适的排序算法可以显著提高应用程序的性能和效率。

希望本文能够帮助读者深入理解排序算法,并在实际项目中做出明智的选择,以达到最佳的排序效果。同时,了解排序算法的发展趋势也将有助于读者在未来应对更复杂的排序问题。感谢阅读本文,希望对您有所帮助! 🚀😊

参考资料

在编写本文时,我们参考了以下资料:

  1. Introduction to Algorithms
  2. Sorting Algorithms
  3. Data Structures and Algorithms

这些参考资料为本文提供了有关排序算法的深入信息和理论基础。

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

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

相关文章

chroma 向量库使用;查询、更新与插入

参考: https://docs.trychroma.com/usage-guide https://blog.csdn.net/weixin_46515328/article/details/131855650 chroma 支持保存文档、向量&#xff0c;和向量的ids值 ##安装 pip install chromadb1、使用 import chromadb##这句可以数据库默认时刻保存&#xff0c;启动…

岭回归与LASSO回归:解析两大经典线性回归方法

文章目录 &#x1f34b;引言&#x1f34b;岭回归&#xff08;Ridge Regression&#xff09;&#x1f34b;实战---岭回归&#x1f34b;LASSO回归&#xff08;LASSO Regression&#xff09;&#x1f34b;实战---LASSO回归&#x1f34b;岭回归和LASSO哪个更容易是直线&#x1f34b…

Cannot read properties of null bug解决方法

项目场景&#xff1a; vue3element plusts。 问题描述 本地运行没有任何错误&#xff0c;在生产环境中&#xff0c;当点击按钮&#xff0c;展示el-dialog时第一次正常&#xff0c;关闭时报错 原因分析&#xff1a; 定位到el-dialog组件&#xff0c;最初认为是dialog中table依…

IMAGEBIND: One Embedding Space To Bind Them All论文笔记

论文https://arxiv.org/pdf/2305.05665.pdf代码https://github.com/facebookresearch/ImageBind 1. Motivation 像CLIP这一类的方法只能实现Text-Image这两个模态的 Embedding 对齐&#xff0c;本文提出的ImageBind能够实现六个模态&#xff08;images, text, audio, depth, t…

进阶指针(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 进阶指针&#xff08;一&#xff09; 0.回顾初阶指针1.字符指针1.1 相关面试题 2.数组指针3.指针数组3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4.数组传参和指针传参4.…

linux下解决tomcat错误问题

错误一&#xff1a; Linux下Tomcat启动报错&#xff1a;Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 原因&#xff1a;可能是Linux环境变了&#xff0c;需要在catalina.sh文件里指定JDK路径 解决方式&#xff1a; 在/bin/catalina.sh配置文件中加…

基于springboot+vue的爱心助农网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Linux离线安装telnet

TELNET rmp地址 链接: https://pan.baidu.com/s/1Yl3zt1p3zjp2fYTwByf7dQ?pwdgdcg 提取码: gdcg 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 命令 rpm -ivh xinetd-2.3.15-14.el7.x86_64.rpm rpm -ivh telnet-0.17-65.el7_8.x86_64.rpm rpm -ivh telnet-…

autoware.ai docker安装

1.进行docker安装 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88sudo add-apt-reposi…

Unity实战(11):项目非启动状态下使用代码批量替换材质

目录 前言 配置环境 一、场景准备 二、代码演示 三、效果呈现 四、关于Resources.Load()的说明 前言 本文内容为unity在编辑状态&#xff08;非启动状态&#xff09;下使用代码批量替换材质&#xff0c;该方法也适用于其他在编辑状态下对物体的操作需求。 配置环境 win1…

Mysql003:用户管理

前言&#xff1a;本章节讲解的是mysql中的用户管理&#xff0c;包括&#xff08;管理数据用户&#xff09;、&#xff08;控制数据库的访问权限&#xff09;。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间&#xff1f; 1、在手机上找到「设置」并点击打开&#xff1b; 2、在设置内找到「健康使用手机」并点击进入&#xff1b; 3、开启健康使用手机后&#xff0c;选择孩子使用&#xff1b; 4、在健康使用手机内&#xff0c…

已解决 Java Error: Exception in thread ‘main‘ java.lang.ClassNotFoundException

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

Godot配置C#语言编写脚本(使用VSCode作为外部编辑器)

文章目录 Godot部分查看VSCode的所在位置配置外部编辑器 配置VSCode编写脚本中文注释 其他文章字符编码 Godot部分 打开编辑器-编辑器设置&#xff1b; 查看VSCode的所在位置 右键单击你的VScode快捷方式&#xff0c;选择属性。 这里的目标就是你的VSCode所在的位置。 配…

并发编程——synchronized

文章目录 原子性、有序性、可见性原子性有序性可见性 synchronized使用synchronized锁升级synchronized-ObjectMonitor 原子性、有序性、可见性 原子性 数据库事务的原子性&#xff1a;是一个最小的执行的单位&#xff0c;一次事务的多次操作要么都成功&#xff0c;要么都失败…

【探索Linux】—— 强大的命令行工具 P.9(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…

【智慧工地源码】智慧工地助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

Python实验一

1.计算圆椎体体系积。 要求: 交互式输入圆椎体的底面半径和高。 提示&#xff1a;&#xff08;1&#xff09;使用两个函数 input()和 eval()&#xff0c;其中 input()函数用于接收用户的输入&#xff0c;接收的值 是字符串&#xff1b;eval()函数用来执行一个字符串表达式&…

2023护网行动面试题目汇总

目录 一、常用的外围打点工具有哪些&#xff1f; 二、描述一下外围打点的基本流程&#xff1f; 三、怎么识别CDN? 四、怎么判断靶标站点是windows系统还是Linux系统&#xff1f; 五、举常见的FOFA在外网打点过程中的查询语句&#xff1f; 六、常见的未授权访问漏洞有哪些…

【官宣】游戏革命刚刚开始!

正如标题所言&#xff0c;随着官方 Aavegotchi dApp 游戏中心的推出&#xff0c;我们的 Gotchi 游戏革命今天正式开始。 游戏中心代表着 Aavegotchi.com 向类似于 Steam 和 Epic Games 等完整游戏平台的重大转变。 游戏中心是当今所有 Gotchi 主题游戏的综合目录&#xff0c;…