排序---java---黑马

排序算法

名称平均时间复杂度最好情况最坏情况空间复杂度稳定性
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) N N N
堆排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( 1 ) O(1) O(1) N N N
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1) Y Y Y
希尔排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( n l o g n ) O(nlogn) O(nlogn) O ( 1 ) O(1) O(1) N N N
归并排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n ) O(n) O(n) Y Y Y
快速排序 O ( n l o g n ) O(nlogn) O(nlogn) O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( l o g n ) O(logn) O(logn) N N N
计数排数 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( k ) O(k) O(k) Y Y Y
桶排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n 2 ) O(n^2) O(n2) O ( n + k ) O(n+k) O(n+k) Y Y Y
基数排序 O ( n × k ) O(n×k) O(n×k) O ( n × k ) O(n×k) O(n×k) O ( n × k ) O(n×k) O(n×k) O ( n + k ) O(n+k) O(n+k) Y Y Y

一、冒泡排序

递归版

在这里插入图片描述

非递归

public class BubbleSort{
    
    public static void sort(int[] a) {
        
    }
    
    public void bubble(int[] a) {
        int j = a.length - 1;
        int x = 0;
        while (true) {
            
            for(int i = 0; i < j - 1; i++) {
                if (a[i] > a[i + 1]) {
                    swap(a, i, i + 1);
                  	x = i;  
                }
            }
            j = x;
            if (j == 0) {
                break;
            }
        }
    }
    
    private void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

二、选择排序

在这里插入图片描述

public class SelectSort{
    
    public static void sort(int[] a) {
        for(int i = a.length - 1; i > 0; i--) { 
            int max = i;
            
            for(int j = 0; j < i; j++) {
                if (a[j] > a[max]) {
                    max = j;
                }
            }
            if (max != i) {
                swap(a, i, max);
            } 
        }
    }
    

    
 	private void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }   
}

堆排序

public class HeapSort() {
    
    public static void sort(int[] a) {
        heapify(a, a.length);
        for(int i = a.length - 1; i > 0; i--) {
            swap(a, 0, i);
            down(a, 0, i);
        }
    }
    
    public static void heapify(int[] array, int size) {
        for(int i = size / 2 - 1; i >= 0; i--) {
            down(array, i, size);
        }
    }
    
    public static void down(int[] array, int parent, int size) {
        int left = 2 * parent + 1;
        int right = left + 1;
        
        int max = parent;
        if (left < size && array[left] > array[max]) {
            max = left;
        }
        if (right < size && array[right] > array[max]) {
            max = right;
        }
        if (max != parent) {
            swap(array, max, parent);
            down(array, max, size);
        }
    }
    
    public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

插入排序

递归实现

public class InsertSort{
    
    public static void sort(int[] a) {
        insert(a, 1);
    }
    
    public static void insert(int[] a, int low) {
        if (low == a.length) {
            return ;
        }
        int t = a[low];
        int i;
        for(i = low - 1; i >= 0 && a[i] > t; i--) {
            a[i + 1] = a[i];
        }
        if (i + 1 != low) {
            a[i + 1] = t;
        }
        insert(a, low + 1);
    }
}
public class InsertSort{
    
    public static void sort(int[] a) {
        insert(a, 1);
    }
    
    public static void insert(int[] a, int low) {
        if (low == a.length) {
            return;
        }
        int temp = a[low];
       	int i = low - 1;
        while (i >= 0; a[i] > temp) {
            a[i + 1] = a[i];
            i--;
        }
        if (i + 1 != low) {
            a[i + 1] = temp;
        }
        insert(a, low + 1);
    }
}

非递归实现

public class InsertSort {
    
    public static void sort(int[] a) {
        for(int i = 1; i < a.length; i++) {
            int temp = a[i];
            for(int j = i - 1; j >= 0 && a[j] > a[i]; j--) {
                a[j + 1] =a[j];
            }
            if(j != i - 1) {
                a[j + 1] = temp;
            }
        }
    }
}
public class InsertSort {
    
    public static void sort(int[] a) {
        for(int i = 1; i < a.length; i++) {
            int temp = a[i];
            int j = i - 1;
            while (j >= 0 && a[j] > temp) {
                a[j + 1] = a[j];
            }
            if(j != i - 1) {
                a[j + 1] = temp;
            }
        }
    }
}

希尔排序

在这里插入图片描述

public class ShellSort{
    
    public static void sort(int[] a){
        for(int gap = a.length >> 1; gap >= 1; gap = gap >> 1) {
            
            for(int i = gap; i < a.length; i++) {
                int temp =  a[i];
               	int j = i - gap;
                while (j >= 0 && a[j] > temp) {
                    a[j + gap] = a[j];
                    j -= gap;
                }
                
                if (j + gap != i) {
                    a[j + gap] = temp;
                }
            }
        }
    }
}

归并排序

在这里插入图片描述

递归方法

public class MergeSort{
    
    public static void sort(int[] a) {
        int[] a2 = new int[a.length];
        merge(a, 0, a.length - 1, a2);
    }
    
    public static void split(int[] a, int left, int right, int[] a2) {
        if (left == right) {
            return;
        }
        int m = (left + right) >>> 1;
        
        split(a, left, m, a2);
        split(a, m + 1, right, a2);
        
        // 合并操作
        merge(a, left, m, m + 1, right, a2);
        System.arraycopy(a2, left, a, left, right - left + 1);
        
    }
    
    public static void merge(int[] a1, int i, int iend, int j, int jend, int[] a2) {
        int k = i;
        while (i <= iend && j <= jend) {
            if (a1[i] <= a1[j]) {
                a2[k] = a1[i];
                i++;
            } else {
                a2[k] = a1[j];
                j++;
            }
            k++;
        }
        if (i > iend) {
            System.arraycopy(a1, j, a2, k, jend - j + 1);
        } 
        if (j > jend) {
            System.arraycopy(a1, i, a2, k, iend - i + 1);
        }
    }
}

非递归方式


归并加插入

public class MergeInsertionSort{
    
    public static void insertion(int[] a, int left, int right) {
        for(int i = left + 1; i <= right; i++) {
            int t = a[i];
            int j = i - 1;
            while (j >= left && a[j] > t) {
                a[j + 1] = a[j];
                j--;
            }
            if (i != j + 1) {
                a[j + 1] = t;
            }
        }
    }
    
    public static void merge(int[] a, int i, int iend, int j, int jend, int[] a2) {
        int k = 0;
        while (i <= iend && j <= jend) {
            if (a[i] <= a[j]) {
                a[k] = a[i];
                i++;
            } else {
                a[k] = a[j];
                j++;
            }
            k++;
        }
        if (j > jend) {
            System.arraycopy(a, i, a2, k, iend - i + 1);
        }
        if (i > iend) {
            System.arraycopy(a, j, a2, k, jend - j + 1);
        }
    }
    
    public static void split(int[] a, int i, int j, int[] a2) {
        if (i == j) {
            // 插入排序
            insertion(a, i, j);
            return;
        }
        int m = (i + j) >>> 1;
        
        split(a, i, m);
        split(a, m + 1, j);
        
        // 合
        merge(a, i, m, m + 1, j, a2);
        System.arraycopy(a2, left, a, left, j - i + 1);
    }
}

快排

单边循环

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

public class QuickSortLomuto{
    
    public static void sort(int[] a) {
        quick(a, 0, a.length - 1);
    }
    
    public static void quick(int[] a, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(a, left, right);
        quick(a, left, p - 1);
        quick(a, p + 1, right);
    }
    
    public static int partition(int[] a, int left, int right) {
        int pv = a[right];
        int i = left;
        int j = right;
        while (i < j) {
            if (a[j] < pv) {
                if (i != j) {
                    swap(a, i, j);
                }
                i++;
            }
            j++;
        }
        swap(a, i, right);
        return i;
    }
    
    public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

双边循环

在这里插入图片描述

注意事项

  • 加内层循环的i < j 条件
  • 先处理j,后处理i
  • 随机元素作为基准点
public class QuickSortLomuto{
    
    public static void sort(int[] a) {
        quick(a, 0, a.length - 1);
    }
    
    public static void quick(int[] a, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(a, left, right);
        quick(a, left, p - 1);
        quick(a, p + 1, right);
    }
    
    public static int partition(int[] a, int left, int right) {
        int pv = a[left];
        int i = left;
        int j = right;
        while (i < j) {
            while (i < j && a[j] > pv) {
                j--;
            }
            while (i < j && a[i] <= pv) {
                i++;
            }
            
            swap(a, i, j);
        }
        swap(a, left, i);
        return i;
    }
    
    public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

改进

public class QuickSortLomuto{
    
    public static void sort(int[] a) {
        quick(a, 0, a.length - 1);
    }
    
    public static void quick(int[] a, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(a, left, right);
        quick(a, left, p - 1);
        quick(a, p + 1, right);
    }
    
    public static int partition(int[] a, int left, int right) {
        int pv = a[left];
        int i = left;
        int j = right;
        while (i <= j) {
            while (i <= j && a[i] < pv) {
                i++;
            }
            while (i <= j && a[j] > pv) {
                j--;
            }
            if (i <= j) {
                swap(a, i, j);
            }
        }
        swap(a, left, j);
        return j;
    }
    
    public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

计数排序

public class CountSort{
    
    public static void sort(int[] a) {
    	int max = a[0];
        for(int num : a) {
            if (num > max) {
                max = num;
            }
        }
        int[] counts = new int[max + 1];
        
        for(int i = 0; i < a.length; i++) {
            counts[a[i]]++;
        }
        
        int k = 0;
        for(int i = 0; i < count.length; i++) {
            while (count[i] > 0) {
                a[k++] = i;
                count[i]--;
            }
        }
        
    } 
}

代码改进

public class CountSort{
    
    public static void sort(int[] a) {
    	int max = a[0];
        int min = a[0];
        for(int num : a) {
            if (num > max) {
                max = num;
            }
            if (num < min) {
                min = num;
            }
        }
        int[] counts = new int[max - min + 1];
        
        //for(int i = 0; i < a.length; i++) {
        //    counts[a[i]]++;
        //}
        // 使用增强for循环
        for(int num : a) {
            counts[num - min]++;
        }
        int k = 0;
        for(int i = 0; i < counts.length; i++) {
            while (counts[i] > 0) {
                a[k++] = i + min;
                count[i]--;
            }
        }
        
    } 
}

桶排序

public clsss BucketSor{
    
    public static void sort(int[] a) {
        List buckets = new ArrayList[10];
        for(int i = 0; i < a.length; i++) {
            buckets[i] = new ArrayList();
        }
        
        for(int num : a) {
            buckets[num % 10] = num;
        }
        int k = 0;
        for(List bucket : buckets) {
            int[] array = new int[bucket.size()];
            if (bucket.size() > 0) {
                for(int i = 0; i < bucket.size(); i++) {
                    array[i] = bucket.get(i);
                }
            }
            InsertSort.sort(array);
            for(int i : array) {
                a[k++] = i;
            }
        }
    } 
}

基数排序

public class RadixSort{
    
    public static void sort(String[] a, int length) {
        ArrayList<String>[] buckets = new ArrayList<>[10];
        for(int i = 0; i < 10; i++) {
            buckets[i] = new ArrayList<>();
        }
        for(int i = length - 1; i >= 0; i--) {
            for(String s : a) {
                bucket[s.charAt(i) - '0'].add(s);
            }

            int k = 0;
            for(ArrayList<String> bucket : buckets) {
                for(String s : bucket) {
                    a[k++] = s;
                }
                bucket.clear();
            }
        }
    } 
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。 你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3&#xff0c;并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] a[1] * b[i1] a[2] * b[i2] a[3] * b[i3] 的值。 返回你能够获得的 最大…

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…

如何使用FastAPI开发Serverless应用?

使用FastAPI开发Serverless应用是一种现代且高效的方法&#xff0c;它结合了FastAPI的高性能和Serverless架构的灵活性、可扩展性以及低成本。下面是一个基本指南&#xff0c;帮助你从零开始创建并部署一个FastAPI应用到Serverless环境。 1. 安装FastAPI和Uvicorn 首首先&…

RK3568学习之Nginx移植+RTMP推流

1.下载 Nginx 源码 进入到 Ubuntu 系统的某个目录下&#xff0c;下载 Nginx 源码&#xff1a; wget http://nginx.org/download/nginx-1.20.0.tar.gz这里我们下载的是 1.20 版本&#xff0c;这是比较新的版本了。下载完成之后将得到一个名为 nginx-1.20.0.tar.gz的压缩包文件…

思想实验思维浅谈

思想实验思维浅谈 思想实验&#xff08;Thought Experiment&#xff09;是一种在思想中进行的假想实验&#xff0c;思想实验激发人的想象力和思辨能力&#xff0c;是科学家思考问题的重要工具&#xff0c;通过想象、推理和分析来探索某种理论、假设或概念的可能性和内在逻辑&am…

微服务架构 --- 使用Sentinel来处理请求限流+线程隔离+服务熔断

目录 一.什么是Sentinel&#xff1f; 二.Sentinel的核心概念&#xff1a; 三.Sentinel的使用&#xff1a; 1.在本地运行Sentinel控制台&#xff1a; 2.在微服务模块导入依赖以及配置文件&#xff1a; &#xff08;1&#xff09;导入依赖&#xff1a; &#xff08;2&#…

RPC通讯基础原理

1.RPC&#xff08;Remote Procedure Call&#xff09;概述 RPC是一种通过网络从远程计算机上调用程序的技术&#xff0c;使得构建分布式计算更加容易&#xff0c;在提供强大的远程调用能力时不损失本地调用的语义简洁性&#xff0c;提供一种透明调用机制&#xff0c;让使用者不…

数据字典是什么?和数据库、数据仓库有什么关系?

一、数据字典的定义及作用 数据字典是一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字典的主要作用如下&#xff1a; 1. 对于数据开发者来说&#xff0c;数据字典包含了关于数据结构和内容的清晰…

centos7上安装minio及使用方法介绍

MinIO是一个高性能、分布式对象存储系统,可以用于存储大量的非结构化数据,例如图片、视频、日志文件等。它是一个开源项目,可以在各种环境中部署,包括本地服务器、公共云和混合云环境。 github仓库地址:https://github.com/minio 一、安装说明 本章教程,是在Linux Centos…

AutoCompleteTextView

AutoCompleteTextView的学习 简单使用AutoCompleteTextView mainactivity.java import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.WindowManager; import android.widget.ArrayAdapter; import android.widget.AutoCompleteT…

【环境搭建】远程服务器搭建ElasticSearch

参考&#xff1a; 非常详细的阿里云服务器安装ElasticSearch过程..._阿里云服务器使用elasticsearch-CSDN博客 服务器平台&#xff1a;AutoDL 注意&#xff1a; 1、切换为非root用户&#xff0c;su 新用户名&#xff0c;否则ES无法启动 2、安装过程中没有出现设置账号密码…

“探索Adobe Photoshop 2024:订阅方案、成本效益分析及在线替代品“

设计师们对Adobe Photoshop这款业界领先的图像编辑软件肯定不会陌生。如果你正考虑加入Photoshop的用户行列&#xff0c;可能会对其价格感到好奇。Photoshop的价值在于其强大的功能&#xff0c;而它的价格也反映了这一点。下面&#xff0c;我们就来详细了解一下Adobe Photoshop…

Chromium 如何查找V8 引擎中JavaScript 标准内置对象

JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org) 一、JavaScript 标准内置对象 本章介绍和说明了 JavaScript 中所有的标准内置对象、以及它们的方法和属性。 这里的术语“全局对象”&#xff08;或标准内置对象&#xff09;不应与 global 对象混淆。这里的“全局…

07 django管理系统 - 部门管理 - 搜索部门

在dept_list.html中&#xff0c;添加搜索框 <div class"container-fluid"><div style"margin-bottom: 10px" class"clearfix"><div class"panel panel-default"><!-- Default panel contents --><div clas…

【学习笔记】什么是MongoDB

文章目录 MongoDB 简介体系结构数据模型MongoDB 的特点 MongoDB 简介 学习一个东西就跟认识一个人一样&#xff0c;下面有情MongoDB来做个自我介绍 大家好&#xff0c;俺是MongoDB&#xff0c;是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计俺就是用于简化开…

6.计算机网络_UDP

UDP的主要特点&#xff1a; 无连接&#xff0c;发送数据之前不需要建立连接。不保证可靠交付。面向报文。应用层给UDP报文后&#xff0c;UDP并不会抽象为一个一个的字节&#xff0c;而是整个报文一起发送。没有拥塞控制。网络拥堵时&#xff0c;发送端并不会降低发送速率。可以…

UNI VFX Missiles Explosions for Visual Effect Graph

Unity URP和HDRP的通用视觉效果 使用在视觉效果图中制作的高性能GPU粒子系统。 无需进入视觉效果图编辑器即可轻松自定义VFX。 使用(VFX)事件——一个游戏对象可存储多个效果,这些效果可通过C#或视觉脚本触发。 总共32个事件(不包括“停止”事件)。 ❓ 什么是(VFX)事件?…

前端开发学习(一)VUE框架概述

一、MVC模式与MVVM模式 1.1mvc模式 MVC模式是移动端应用广泛的软件架构之一&#xff0c;MVC模式将应用程序划分为3部分:Model(数据模型)、View(用户界面视图)和Controller(控制器)。MVC模式的执行过程是将View层展示给用户&#xff0c;也就是通过 HTML页面接受用户动作&#…

【算法篇】贪心类(1)(笔记)

目录 一、理论基础 1. 大纲 2. 求解步骤 二、Leetcode 题目 1. 分发饼干 2. 摆动序列 3. 最大子序和 4. 买卖股票的最佳时机 II 5. 跳跃游戏 6. 跳跃游戏 II 7. K 次取反后最大化的数组和 8. 加油站 9. 分发糖果 一、理论基础 1. 大纲 2. 求解步骤 将问题分解为…

CTFHUB技能树之SQL——MySQL结构

开启靶场&#xff0c;打开链接&#xff1a; 先判断一下是哪种类型的SQL注入&#xff1a; 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说明是整数型注入 判断一下字段数&#xff1a; 1 order by 2# 正常回显 1 order by 3# 回显错误&#xff0c;说明字段数是2列 知道…