数据结构与算法(六)排序 插入&希尔&归并

简介: 数据结构与算法(六)排序 插入&希尔&归并

插入排序

public static void sort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {//默认首位已排好序
            int data = arr[i];
            int j = i;
            while (j > 0) {
                if (data > arr[j - 1]) //要排序的元素与前一位比较
                    break;//大则退出
                arr[j] = arr[j - 1];//小则将前一位元素向后移动 留下一个空位
                j--;
            }
            arr[j] = data;//将排序元素赋值给空位
        }
    }

希尔排序

public static void sort(int[] arr) {
        //将元素分组再进行插入排序
        //4, 8, 3, 6, 2, 9 , 5 , 11 , 1
        //n/2=4 步长为4 分为4 2 1| 8 9 | 3 5 | 6 11
        //排序后 1 2 4 | 8 9 | 3 5 | 6 11
        //n/2/2=2 步长为2  1 4 9 5 11|2 8 3 6
        //排序 1 4 5 9 11|2 3 6 8
        //n/2/2/2=1 步长为1 排序后-> 1 2 3 4 5 6 8 9 11
        //最外层为步长循环
        int n = arr.length;
        for (int i = n / 2; i > 0; i = i / 2) { //每次循环步长缩小一半
            for (int j = i; j < n; j++) { //从n/2开始,默认前部分(每个分组的首位)已排好序
                int k = j;
                int data = arr[j];
                while (k >= i) {
                    if (data > arr[k - i])
                        break;
                    arr[k] = arr[k - i];
                    k = k - i;
                }
                arr[k] = data;
            }
        }
    }

归并排序

  1. 图解

    归并排序.png

  2. 代码
public static void sort(int[] arr) {
        //先进行拆分,再进行合并
        split(0, arr.length - 1, arr);
    }
    public static void split(int left, int right, int[] arr) {
        if (left == right) return;
        int mid = (left + right) / 2;//拆分的中间值
        split(left, mid, arr);
        split(mid + 1, right, arr);
        //合
        merge(left, mid, right, arr);
    }
    public static void merge(int left, int mid, int right, int[] arr) {
        int[] temp = new int[right + 1 - left];
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] < arr[j])
                temp[k++] = arr[i++];
            else
                temp[k++] = arr[j++];
        }
        while (i <= mid)
            temp[k++] = arr[i++];
        while (j <= right)
            temp[k++] = arr[j++];
        System.arraycopy(temp, 0, arr, left, temp.length);
    }
目录
相关文章
|
13天前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
12 0
|
16天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
TU^
|
19天前
|
搜索推荐 算法 测试技术
数据结构~~排序
数据结构~~排序
TU^
10 1
|
7天前
|
算法 Java 调度
Java数据结构与算法:拓扑排序
Java数据结构与算法:拓扑排序
|
7天前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
14 0
|
12天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
13天前
|
人工智能 算法 BI
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 $n$ 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。$20\%$ 数据 $n\leq10$,$50\%$ 数据 $n\leq10^3$,$100\%$ 数据 $n\leq10^6$。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
12 0
|
4天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
21小时前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
8天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
30 8