各种排序算法【持续更新中.....】

news2024/11/25 10:26:54

1.归并排序

归并排序 ,归并排序是采用分治法(Divide and Conquer)的一个非常典型的应用,所以我们先来说一下什么是分治法。

分治法

定义

分治(英语:Divide and Conquer),字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

过程

分治算法的核心思想就是「分而治之」。

大概的流程可以分为三步:分解 -> 解决 -> 合并。

  1. 分解原问题为结构相同的子问题。
  2. 分解到某个容易求解的边界之后,进行递归求解。
  3. 将子问题的解合并成原问题的解。

分治法能解决的问题一般有如下特征:

  • 该问题的规模缩小到一定的程度就可以容易地解决。
  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质,利用该问题分解出的子问题的解可以合并为该问题的解。
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

参考链接:

递归 & 分治 - OI Wiki (oi-wiki.org)

了解清楚分治法后,我们来看归并排序

归并排序

merge

归并排序最核心的部分是合并(merge)过程:将两个有序的数组 a[i] 和 b[j] 合并为一个有序数组 c[k]

从左往右枚举 a[i] 和 b[j],找出最小的值并放入数组 c[k];重复上述过程直到 a[i] 和 b[j] 有一个为空时,将另一个数组剩下的元素放入 c[k]


import  java.util.*;

public class MergeSort {
    public static void main(String[] args) {
        int[] a = {3, 4, 5};
        int[] b = {1, 2};
        System.out.println("合并后的数组: " + Arrays.toString(merge(a, b)));
    }

    public static int[] merge(int[] a, int[] b) {
        int i = 0, j = 0;
        int[] c = new int[a.length + b.length];

        while (i < a.length && j < b.length) {
            // 数组b比a小
            if (b[j] < a[i]) {
                // 将b[j]添加到c中,并增加j ,一定不能写成++j
                c[i + j] = b[j++];
            } else {
                c[i + j] = a[i++];
            }
        }

        // b数组遍历完了,将a数组中剩余元素添加到c中
        while (i < a.length) {
            c[i + j] = a[i++];
        }
        // a 数组遍历完了,将b数组中剩余的元素添加到c中
        while (j < b.length) {
            c[i + j] = b[j++];
        }

        return c;
    }
}

分治法

  1. 当数组长度为 为1 时,该数组就已经是有序的,不用再分解。

  2. 当数组长度大于 1 时,该数组很可能不是有序的。此时将该数组分为两段,再分别检查两个数组是否有序(用第 1 条)。如果有序,则将它们合并为一个有序数组;否则对不有序的数组重复第 2 条,再合并。

整个流程见下图

    public static int[] mergeSort(int[] arr) {
        if (arr.length <= 1) {
            return arr;
        }

        int middle = arr.length / 2;
        // 取原本数组的一个副本,左半部分
        int[] left = Arrays.copyOfRange(arr, 0, middle);
        // 取原本数组的一个副本,右半部分
        int[] right = Arrays.copyOfRange(arr, middle, arr.length);

        left = mergeSort(left);
        right = mergeSort(right);

        return merge(left, right);
    }

整体代码

整个归并排序的代码如下

package mbb;

import java.util.Arrays;

public class MergeSortExample {

    // 归并两个数组的辅助方法
    public static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        int i = 0, j = 0, k = 0;

        while (i < left.length && j < right.length) {
            if (left[i] <= right[j]) {
                result[k++] = left[i++];
            } else {
                result[k++] = right[j++];
            }
        }

        // 将剩余的元素拷贝到结果数组
        while (i < left.length) {
            result[k++] = left[i++];
        }
        while (j < right.length) {
            result[k++] = right[j++];
        }

        return result;
    }

    // 归并排序的主要方法
    public static int[] mergeSort(int[] arr) {
        if (arr.length <= 1) {
            return arr;
        }

        int middle = arr.length / 2;
        // 取原本数组的一个副本,左半部分
        int[] left = Arrays.copyOfRange(arr, 0, middle);
        // 取原本数组的一个副本,右半部分
        int[] right = Arrays.copyOfRange(arr, middle, arr.length);

        left = mergeSort(left);
        right = mergeSort(right);

        return merge(left, right);
    }

    // 主函数,用于演示归并排序
    public static void main(String[] args) {
        int[] arr = {34, 7, 23, 32, 5, 62};
        System.out.println("Original array: " + Arrays.toString(arr));

        int[] sortedArr = mergeSort(arr);
        System.out.println("Sorted array: " + Arrays.toString(sortedArr));
    }
}

不懂的强烈建议看下面三个链接

排序算法:归并排序【图解+代码】_哔哩哔哩_bilibili

归并排序 - OI Wiki (oi-wiki.org)

图解归并排序,带你彻底了解清楚!_归并排序算法过程图解-CSDN博客

冒泡排序

冒泡排序的思想非常简单

1. 比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
3. 针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
4. 持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

public class BubbleSortExample {

    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        bubbleSort(array);
        
        System.out.println("Sorted array:");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    // 交换array[j]和array[j+1]
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
}

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

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

相关文章

C++初阶大全

目录 一.命名空间 1.命名空间定义 2.命名空间使用 二.C输入&输出 三.缺省参数 四. 函数重载 五.引用 1.常引用 2.传值、传引用效率比较 3.引用和指针的区别 4.引用和指针的不同点: 小知识点: 六.内联函数 七.auto关键字(C11) 1.auto的使用细则 八.基于范围…

为何你的进销存系统买来却成了摆设?教你7大招解决!

我做企业数字化系统9年&#xff0c;调研的企业大大小小也有几十家了。我发现个挺扎心的现象&#xff1a;有三成企业买的进销存系统&#xff0c;最后都成了闲置的“高科技装饰品”。为啥这些企业舍得掏腰包&#xff0c;到头来却让它们吃灰呢&#xff1f; 说到底&#xff0c;就一…

开源免费的wiki知识库

开源的Wiki知识库有多种选择&#xff0c;它们各自具有不同的特点和优势&#xff0c;适用于不同的场景和需求。以下是一些主流的开源Wiki知识库系统&#xff1a; MediaWiki 简介&#xff1a;MediaWiki是使用PHP编写的免费开源Wiki软件包&#xff0c;是Wikipedia和其他Wikimedia…

达梦数据库的系统视图v$mem_reginfo

达梦数据库的系统视图v$mem_reginfo 达梦数据库的V$MEM_REGINFO视图提供了系统当前已分配但未释放的内存信息。这个视图在MEMORY_LEAK_CHECK参数设置为1时才会注册信息&#xff0c;用于监控内存的申请和释放情况。通过查询V$MEM_REGINFO视图&#xff0c;可以关注REFNUM字段&am…

跟《经济学人》学英文:2024年08月03日这期 Britain’s railways go from one extreme to another

Britain’s railways go from one extreme to another Departing: privatisation. Destination: centralisation 出发:私有化。目的地:集中化 depart&#xff1a;出发 privatisation&#xff1a;美 [ˌpraɪvətaɪ’zeɪʃən] 私有化&#xff1b;民营化&#xff1b;私营化…

IO进程—进程间的通信—共享内存具体函数操作

创建唯一key值—— ftok key_t ftok(const char *pathname, int proj_id); #include <sys/types.h> #include <sys/ipc.h> 功能&#xff1a; ftok函数是用于生成一个键值&#xff08;key_t类型&#xff09;的函数&#xff0c;这个键值通常用于进程间通信&#xff0…

人像修复-通道磨皮

文章目录 原理步骤建立动作一键操作 原理 皮肤看起来比较脏的原因&#xff1a;光影过渡不均匀 步骤 在通道中&#xff0c;找到明暗反差最大的通道&#xff0c;复制一层通道 在复制通道中&#xff0c;用高反差保留&#xff0c;把画面中反差较大的部分保留出来&#xff0c;半…

解决使用Navicat连接数据库时,打开数据库表很慢的问题

今天使用Navicat连接数据库时&#xff0c;发现不管表中数据多少&#xff0c;打开数据库表非常慢。 解决方法&#xff1a; Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定&#xff01; 参考文章&#xff1a;https://51.ruyo.net/14030.…

【ARM】v8架构programmer guide(2)_处理器及V8基础

目录 2.1 ARMv8-A 3. ARMv8的基础 普通世界&#xff08;Non-secure state&#xff09;的特权组件&#xff1a; 安全世界&#xff08;Secure state&#xff09;的特权组件&#xff1a; 安全监视器&#xff08;Secure Monitor&#xff09;&#xff1a; 3.1 execution state…

实现高级社会的构想-基于人工智能模式

实现高级社会(共产主义)的构想 刚过完劳动节,劳动最光荣.在新质生产力思想启发下,我想探讨的是我们当下能否从资本主义或社会主义进入或构建高级社会(共产主义社会)呢?高级社会(共产主义),我的理解可以用平均主义来无限接近,即使政策上无法做到平均分配&#xff0c;也可以通过…

lvs的nat模式配置

lvs的nat模式 准备工作 lvs主机需要两个网络适配器&#xff0c;其中一个为NAT模式&#xff0c;另外一个为仅主机模式&#xff0c;还需要两个server主机&#xff0c;一个为server1还有一个为server2&#xff0c;都为仅主机模式 配置过程 配置ip lvs主机 [rootlvs ~]# cat /…

项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题(栈溢出stackOverflow)深入源码分析解决

文章目录 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverflow&#xff09;深入源码分析解决依赖信息报错信息与分析解决办法 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverfl…

utf-8‘ codec can‘t decode byte 0xd3 in position

1.背景 安装psycopg2-binary&#xff0c;安装命令“pip install psycopg2-binary2.9.7” 完整报错信息如下&#xff1a; (venv) PS D:\workspace_all\pyCharm\MaxKB-main> pip install psycopg2-binary2.9.7 Looking in indexes: https://mirrors.ustc.edu.cn/pypi/web/s…

Python语法重温1

最近做项目的时候&#xff0c;有时总得愣一下语法。所以决定来温习一下。。。 温故而知新&#xff0c;谁都没办法说自己经历时间的流逝后还能时刻记得&#xff0c;希望能帮到你们 列表的替换 如果超出列表元素则会报错。 列表末尾的追加 插入列表操作 可以超出列表之外插入 删…

常见中间件漏洞复现之【WebLogic】!

Weblogic介绍 WebLogic是美国Oracle公司出品的⼀个application server&#xff0c;确切的说是⼀个基于JAVAEE架构的中间件&#xff0c;默认端⼝&#xff1a;7001 WebLogic是⽤于开发、集成、部署和管理⼤型分布式Web应⽤、⽹络应⽤和数据库应⽤的Java应⽤服务器。将Java的动态…

“炎”值加码,数据机房“中暑“罢工,怎么破?

又是热到汗流浃背、头晕脑胀的一天…江浙沪等地正在经历今年来最强高温“烤验”&#xff01;没有最热&#xff0c;只有更热&#xff0c;40摄氏度的高温好像越来越多了&#xff01;最近东北货车司机热到报警&#xff0c;获救后怒赞“杭州人好啊&#xff01;”&#xff0c;“先坐…

DataX迁移数据到StarRocks超大表报too many version问题记录

目录 1 背景说明 2 问题描述 3 解决思路 3.1 磁盘问题 3.2 DataX配置 3.3 分桶设置 3.4 增量迁移 1 背景说明 项目上有两张大表&#xff0c;数据量在300w左右&#xff0c;每天凌晨通过datax将前一天最新的全量户数迁移到StarRocks对应的分区表中。分区表设置的动态分区&a…

SpringBoot 集成原生 Servlet、Filter、Listener

注解方式集成 Servlet、Filter、Listener 启动类添加 ServletComponentScan 注解 SpringBootApplication ServletComponentScan public class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class);} } 创建 Servlet &a…

免费的会声会影软件哪款拥有最强性能

会声会影2024&#xff1a;引领视频创作新时代的创新之旅** 在数字时代的浪潮中&#xff0c;视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步&#xff0c;一款名为“会声会影2024”的视频编辑软件横空出世&#xff0c;它不仅继承了前代产品的优秀传统&#xf…

java集成onlyoffice实现文档在线预览编辑

一、onlyoffice是什么 ONLYOFFICE是一款由Ascensio System SIA公司开发的在线办公软件套件&#xff0c;它提供了文档编辑、电子表格、演示文稿和表单等多种办公工具&#xff0c;旨在提高团队协作效率和文档处理的便捷性。以下是关于ONLYOFFICE的详细介绍&#xff1a; 1、软件…