首页 > 编程语言 >蓝桥杯备考随手记: 常用的三种排序算法(冒泡排序、插入排序、选择排序)

蓝桥杯备考随手记: 常用的三种排序算法(冒泡排序、插入排序、选择排序)

时间:2024-04-05 17:32:30浏览次数:28  
标签:25 arr 冒泡排序 34 蓝桥 64 数组 排序

1. 冒泡排序(Bubble Sort)

冒泡排序是一种简单直观的排序算法,在待排序序列中不断地交换相邻两个元素的位置,通过多次遍历,将最大(或最小)的元素逐渐向右(或左)移动到正确的位置,直到整个序列有序。

冒泡排序的基本思想如下:

  1. 从序列的第一个元素开始,比较相邻两个元素的大小。
  2. 如果前一个元素大于后一个元素,则交换它们的位置,将较大的元素向右移动。
  3. 继续比较下一个相邻的元素,重复上述步骤,直到遍历到序列的最后一个元素。
  4. 重复以上步骤,直至整个序列有序。

给定数组 A=[64,34,25,12,22,11,90],冒泡排序的过程如下:

  1. 第一轮:

    • 比较 64  和 34 ,交换位置,数组变为 [34,64,25,12,22,11,90]。
    • 继续比较 64  和 25 ,交换位置,数组变为 [34,25,64,12,22,11,90]。
    • 继续比较 64  和 12 ,交换位置,数组变为 [34,25,12,64,22,11,90]。
    • 继续比较 64  和  22,交换位置,数组变为 [34,25,12,22,64,11,90]。
    • 继续比较  64 和  11,交换位置,数组变为 [34,25,12,22,11,64,90]。
    • 最后比较  64 和  90,不交换位置。
    • 第一轮结束,最大值 90  已经排在最后。
  2. 第二轮:

    • 比较 34  和 25 ,交换位置,数组变为  [25,34,12,22,11,64,90]。
    • 继续比较 34 和  12,交换位置,数组变为  [25,12,34,22,11,64,90]。
    • 继续比较 34  和  22,交换位置,数组变为  [25,12,22,34,11,64,90]。
    • 继续比较  34 和  11,交换位置,数组变为  [25,12,22,11,34,64,90]。
    • 最后比较  34 和  64,不交换位置。
    • 第二轮结束。
  3. 依此类推,直到数组完全排序。

冒泡排序的时间复杂度为O(n^2),其中n表示待排序序列的长度。冒泡排序是稳定的,因为相同元素的相对顺序不会发生改变。

2. 插入排序(Insertion Sort)

插入排序是一种简单且直观的排序算法,将待排序序列分为已排序和未排序两部分,每次从未排序的部分中取出一个元素插入到已排序的正确位置,直到整个序列有序。

插入排序的基本思想如下:

  1. 从待排序序列中选择一个元素,将其插入到已排序序列的合适位置上。
  2. 从已排序序列的末尾开始,将比当前元素大的元素向右移动,腾出插入位置。
  3. 将当前元素插入到合适的位置上,使已排序序列依然有序。
  4. 重复以上步骤,直到未排序序列中的所有元素都插入到已排序序列中。

给定数组  A=[64,34,25,12,22,11,90],插入排序的过程如下:

  1. 第一轮:
    • 将第二个元素 34  插入到已排序子数组 [64]  的合适位置,数组变为  [34,64,25,12,22,11,90]。
  2. 第二轮:
    • 将第三个元素 25  插入到已排序子数组 [34,64] 的合适位置,数组变为 [25,34,64,12,22,11,90]。
  3. 依此类推,直到数组完全排序。

插入排序的时间复杂度为O(n^2),其中n表示待排序序列的长度。插入排序是稳定的,因为相同元素的相对顺序不会发生改变。

3. 选择排序(Selection Sort)

选择排序是一种简单直观的排序算法,每次从待排序序列中选择最小(或最大)的元素,放到已排序序列的末尾,直到整个序列有序。

选择排序的基本思想如下:

  1. 将待排序序列分为已排序和未排序两部分,初始时已排序序列为空。
  2. 从未排序序列中选择最小(或最大)的元素,将其与未排序序列的第一个元素交换位置,即将最小(或最大)的元素放到已排序序列的末尾。
  3. 将已排序序列的末尾后移一位,将未排序序列缩小一个元素。
  4. 重复以上步骤,直到未排序序列中的所有元素都被加入到已排序序列中。

 给定数组  A=[64,34,25,12,22,11,90],选择排序的过程如下:

  1. 第一轮:
    • 从数组中选择最小值  11,与第一个元素  64 交换位置,数组变为  [11,34,25,12,22,64,90]。
  2. 第二轮:
    • 从第二个元素开始的子数组中选择最小值  12,与第二个元素 34 交换位置,数组变为  [11,12,25,34,22,64,90]。
  3. 依此类推,直到数组完全排序。

选择排序的时间复杂度为O(n^2),其中n表示待排序序列的长度。选择排序是不稳定的,因为相同元素的相对顺序可能会发生改变。

4. 使用 Java 代码实现

  1. 冒泡排序 :
    public class BubbleSort {
        // 冒泡排序方法
        public 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(String[] args) {
            int[] arr = {64, 34, 25, 12, 22, 11, 90};
            // 调用冒泡排序方法对数组进行排序
            bubbleSort(arr);
            System.out.println("冒泡排序后的数组:");
            // 输出排序后的数组
            for (int num : arr) {
                System.out.print(num + " ");
            }
        }
    }
    
  2. 插入排序 :
    public class InsertionSort {
        // 插入排序方法
        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;
                // 将当前元素插入到已排序序列的合适位置
                while (j >= 0 && arr[j] > key) {
                    arr[j + 1] = arr[j];
                    j--;
                }
                arr[j + 1] = key;
            }
        }
    
        public static void main(String[] args) {
            int[] arr = {64, 34, 25, 12, 22, 11, 90};
            // 调用插入排序方法对数组进行排序
            insertionSort(arr);
            System.out.println("插入排序后的数组:");
            // 输出排序后的数组
            for (int num : arr) {
                System.out.print(num + " ");
            }
        }
    }
    
  3. 选择排序 :
    public class SelectionSort {
        // 选择排序方法
        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[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
    
        public static void main(String[] args) {
            int[] arr = {64, 34, 25, 12, 22, 11, 90};
            // 调用选择排序方法对数组进行排序
            selectionSort(arr);
            System.out.println("选择排序后的数组:");
            // 输出排序后的数组
            for (int num : arr) {
                System.out.print(num + " ");
            }
        }
    }
    

在选择三种排序算法时,一般的算法优先选择顺序是:

  1. 插入排序(Insertion Sort):效率高,特别适合部分有序的数组。
  2. 选择排序(Selection Sort):性能一般,介于冒泡排序和插入排序之间。
  3. 冒泡排序(Bubble Sort):效率较低,不推荐在大规模数据集上使用。

标签:25,arr,冒泡排序,34,蓝桥,64,数组,排序
From: https://blog.csdn.net/DaPiCaoMin/article/details/137397769

相关文章

  • 第15届蓝桥STEMA测评真题剖析-2024年3月10日Scratch编程初中级组
    [导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第180讲。第15届蓝桥第5次STEMA测评,这是2024年3月10日举办的STEMA,比赛仍然采取线上形式。这是Scratch初/中级组真题,试题包括两种题型,分别是选择题和编程创作......
  • 冒泡排序及qsort实现
    冒泡排序的核心思想就是:两两相邻的元素进行比较。假设有一个数组,它是:8 32 710 9107 4现在我们要通过两两对比的方式将其升序排列。我们要先将第一个和第二个对比,如果第一个数较大的话就交换位置。也就是说我们首先要将8和3对比然后交换位置,现在我们的数组就变为了3......
  • DAG与拓扑排序
    现实生活中我们经常要做一连串事情,这些事情之间有顺序关系或依赖关系,做一件事情之前必须先做另一件事,如安排客人的座位、穿衣服的先后、课程学习的先后等。这些事情可以抽象为图论中的拓扑排序(TopologicalSorting)问题。例题:P4017最大食物链计数给出一个食物网,要求出这个食物......
  • 蓝桥杯,省赛,dfs专题,地宫取宝,小朋友崇拜圈,飞机降落
    #include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[55][55];//输入所给数组值所分配的内存空间intdp[55][55][15][15];//开创记忆化的存储空间//因为只进行向下走和向右走,所有写成这个样子,不明白的可以在了解以下笛卡尔积,向下是x轴,向右是y轴(一般情况下)int......
  • 信息学奥赛一本通题目解析:1938:【07NOIP普及组】奖学金(排序)
    【题目描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前55名学生发奖学金。期末,每个学生都有33门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学......
  • P8687 [蓝桥杯 2019 省 A] 糖果
    原题链接题解二进制表示每包糖果包含的味道,因为有一种拼接的感觉,然后背包dp,注意这里每个材料不止只能取一个code#include<bits/stdc++.h>usingnamespacestd;intdp[1<<22]={0},candy[105]={0};constintinf=2e9;intmain(){intn,m,k;cin>>n>>m>>k;......
  • [蓝桥杯 2022 国 A] 环境治理(二分 + 弗洛伊德)
        通过题目描述,我们得知如果枚举所有的天数,就不会通过所有的样例,因此我们可以通过二分来列举符合要求的天数,并且我们知道两个城市之间衡量的灰尘度标准就是灰尘度总和最小的那一段路径,也就是说我们需要寻找到权值和最低的那条路径,而我们知道每两个点之间都有路径......
  • 用Java实现快速排序
    快速排序(QuickSort)是一种分治的排序算法。它的基本思想是:选择一个基准元素(本文选择第一个元素)。将数组中比基准小的元素放在基准的左边,比基准大的元素放在基准的右边。对基准左边和右边的子数组分别进行快速排序。快速排序的优点包括:高效性:平均时间复杂度为O(nlogn)。适......
  • 九、算法-排序-堆排序
    常见六大排序:冒泡、选择、插入、快速、归并、堆。在了解堆排序之前,需要了解数据结构-二叉树的知识。二叉树:树中的每个节点下最多只有两个叶子节点;根节点:二叉树的首个节点;叶子节点:非根的节点;父节点-子节点:父节点下方归属的为子节点,是相对而言的关系,在顺序存储的数据结构里......
  • 归并排序 返回逆序数 python
    defmerge_sort_and_count_inversions(arr):n=len(arr)ifn<=1:returnarr,0#如果n小于等于1,数组已经有序,直接返回数组本身和逆序数0mid=n//2left_lst,inv_left=merge_sort_and_count_inversions(arr[:mid])#对左半部分进行递......