常见的排序算法(1)

简介: 常见的排序算法(1)

🌍排序的相关概念:

1 排序:

就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2 稳定性:

两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序算法。

例如:

🌎插入排序

插入排序的核心思想就是把数组中的第一个数据是作为有序的,从第二个数据开始,就要与前面的数据进行比较,在合适的位置进行插入;

代码如下:

public class TestSort {
    public static void main(String[] args) {
        int[] array = {12,23,43,52,24,64,78,0,1,4};
        InsertSort(array);
        System.out.println(Arrays.toString(array));
    }

    /**
     *时间复杂度:O(N^2) 最好情况下O(N)
     * 空间复杂度:O(1)
     * 稳定性:稳定
     * @param array 待排序数组
     */
    public static void InsertSort(int[] array){
        for (int i = 1; i <array.length ; i++) {
            //取出当前要进行比较的数据
            int tmp = array[i];
            //需要从i与前面的数据比较,就从最近的i-1开始
            int j = i-1;
            //j要大于等于零
            for (;j>=0;j--){
                //如果j位置上数据大于tmp,那么就需要将j+1上的数据覆盖成j位置上的数据
                if(array[j]>tmp){
                    array[j+1]=array[j];
                }else{
                    //说明此时数据是有序的,直接退出循环
                    break;
                }
            }
            //将tmp放在j+1位置上
            array[j+1]=tmp;
        }
    }
}

**特点:**时间复杂度为O(N)是在数据有序的情况下,所以对于插入排序而言,数据越有序就越快!


🌏 希尔排序

希尔排序其实就是在插入排序的基础上,进行了优化,它所利用的也是直接插入排序,但是它采用了数据分组的思想,接下来就简单的来了解一下什么是希尔排序!

代码如下:

public class TestSort {
    public static void main(String[] args) {
        int[] array = {12,23,43,52,24,64,78,0,1,4};
        ShellSort(array);
        System.out.println(Arrays.toString(array));
    }

    //交换元素位置
    public static void Swap(int[] array,int i,int j){
        int tmp = array[i];
        array[i]=array[j];
        array[j]=tmp;
    }

    /**
     * 时间复杂度:0(N^1.3)~O(N^1.5)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     * @param array 待排序序列
     */

    public static void ShellSort(int[] array){
        int gap = array.length;
        while(gap!=1){
            Shell(array,gap);
            gap=gap/2;
        }
        Shell(array,1);
    }
    //插入排序
    public static void Shell(int[] array,int gap){
        for(int i=gap;i<array.length;i++){
            int tmp = array[i];
            int j = i-gap;
            for (;j>=0;j-=gap){
                if(array[j]>tmp){
                    array[j+gap]=array[j];
                }else{
                    break;
                }
            }
            array[j+gap]=tmp;
        }
    }
}

🌳 选择排序

选择排序其实就是,每一次都要将数组中,最小的元素放置到第一位

代码如下:

public class TestSort {
    public static void main(String[] args) {
        int[] array = {12,23,43,52,24,64,78,0,1,4};
        selection(array);
        System.out.println(Arrays.toString(array));
    }
    
    //交换元素位置
    public static void Swap(int[] array,int i,int j){
        int tmp = array[i];
        array[i]=array[j];
        array[j]=tmp;
    }

    /**
     * 时间复杂度:O(N^2)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     * @param array 待排序数组
     */

    public static void selection(int[] array){
        for(int i = 0;i<array.length;i++){
            int minIndex = i;//假设最小值下标一开始是i
            for(int j = i+1;j<array.length;j++){
                if(array[minIndex]>array[j]){
                    minIndex=j;//找到最小值小标
                }
            }
            //如果不是i所在位置元素是最小,那么就要交换元素
            if(minIndex!=i){
                Swap(array,i,minIndex);
            }
        }
    }
}

对于选择排序而言,无论数组是否有序,时间复杂度都为O(N^2)!

🍀 堆排序

堆排序就是就是我们之前讲过堆的调整。

代码如下:

public class TestSort {
    public static void main(String[] args) {
        int[] array = {12,23,43,52,24,64,78,0,1,4};
        HeapSort(array);
        System.out.println(Arrays.toString(array));
    }

    //交换元素位置
    public static void Swap(int[] array,int i,int j){
        int tmp = array[i];
        array[i]=array[j];
        array[j]=tmp;
    }

    /**
     * 时间复杂度:O(N*logN)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     * @param array 待排序数组
     */

    public static void HeapSort(int[] array){
        //调整建大堆
        for(int parent = (array.length-1-1)/2;parent>=0;parent--){
            shiftDown(array,parent,array.length);
        }
        //开始排序
        int end = array.length-1;
        while (end>0){
            //将最大的放到最后
            Swap(array,0,end);
            end--;
            //除去最大的之后,堆重新调整,对0位置调整
            shiftDown(array,0,end);
        }

    }

    public static void shiftDown(int[] array,int parent,int len){
        int child = 2*parent+1;
        while (child<len){
            //找到左右节点的最大值
            if(child+1<len&&array[child]<array[child+1]){
                child++;
            }
            if(array[child]>array[parent]){
                Swap(array,parent,child);
                parent=child;
                child=2*parent+1;
            }else{
                break;
            }
        }
    }
}

堆的详解

🌱 冒泡排序

冒泡排序的时间复杂度:O(N^2)

空间复杂度:O(1)

稳定性:稳定

图解冒泡排序

源码地址

目录
相关文章
|
6月前
|
大数据
“你朋友圈的真面目,大数据都知道!”——用社交网络分析看透人情世故
“你朋友圈的真面目,大数据都知道!”——用社交网络分析看透人情世故
205 16
|
XML Java 数据库连接
Mybatis 模块拆份带来的 Mapper 扫描问题
Mybatis 模块拆份带来的 Mapper 扫描问题
142 0
|
11月前
|
数据可视化 API
文档智能评测测试
评测积分链路测试
101 9
【Java】static 修饰变量
【Java】static 修饰变量
|
安全 数据安全/隐私保护
WIN10系统下如何查看WIFI密码
WIN10系统下如何查看WIFI密码
1797 0
|
编解码 UED
一天超2000次,阿里如何打响音视频超时空战役?
在阿里,音视频会议已经成为跨地区沟通、开会以及招聘的首选方式。
1717 0
|
2天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
4天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
4天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
536 2