首页 > 其他分享 >2、排序基础

2、排序基础

时间:2023-04-10 13:59:46浏览次数:24  
标签:arr int void 基础 static 排序 public

1、选择排序

选择排序是一个基础的排序算法,它的复杂度是 O(n2)

public class SelectionSort {
    
    private SelectionSort() {
    }
    
    private static <E> void swap(E[] arr, int a, int b) {
        E k = arr[a];
        arr[a] = arr[b];
        arr[b] = k;
    }

    /**
     * 正着排
     */
    public static <E extends Comparable<E>> void sort(E[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            // 循环不变量: arr[0, i) 已排序
            // 循环体维持循环不变量: 向 arr[i] 放置剩余元素中最小的元素
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j].compareTo(arr[minIndex]) < 0) minIndex = j;
            }
            swap(arr, i, minIndex);
        }
    }

    /**
     * 倒着排
     */
    public static <E extends Comparable<E>> void sort1(E[] arr) {
        for (int i = arr.length - 1; i > 0; i--) {
            // 循环不变量: arr(i, n] 已排序
            // 循环体维持循环不变量: 向 arr[i] 放置剩余元素中最大的元素
            int maxIndex = i;
            for (int j = i - 1; j >= 0; j--) {
                if (arr[j].compareTo(arr[maxIndex]) > 0) maxIndex = j;
            }
            swap(arr, i, maxIndex);
        }
    }
}

2、插入排序

插入排序是一个基础的排序算法,它的复杂度是 O(n2)
但是我们可以对它进行优化,使其对近乎有序的数据排序变得更快,对完全有序的数据排序复杂度为 O(n)
我们的优化是非常重要的,优化后的插入排序虽然最坏情况下复杂度还是 O(n2),但是高级的排序算法也会用到它

public class InsertionSort {

    private InsertionSort() {
    }

    private static <E extends Comparable<E>> void swap(E[] arr, int a, int b) {
        E k = arr[a];
        arr[a] = arr[b];
        arr[b] = k;
    }

    /**
     * 正着排
     */
    public static <E extends Comparable<E>> void sort(E[] arr) {
        for (int i = 1; i < arr.length; i++) {
            // 循环不变量: arr[0, i) 已局部排序
            // 循环体维持循环不变量: 将 arr[i] 插入合适的位置(也可以理解为调整 arr[0...i] 中与 i 绑定的逆序数对)
            E k = arr[i];
            int j;
            for (j = i; j - 1 >= 0 && arr[j - 1].compareTo(k) > 0; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = k;
        }
    }

    /**
     * 插入排序 arr[l, r]
     */
    public static <E extends Comparable<E>> void sort(E[] arr, int l, int r) {
        for (int i = l + 1; i <= r; i++) {
            E k = arr[i];
            int j;
            for (j = i; j - 1 >= l && arr[j - 1].compareTo(k) > 0; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = k;
        }
    }

    /**
     * 倒着排
     */
    public static <E extends Comparable<E>> void sort3(E[] arr) {
        for (int i = arr.length - 2; i >= 0; i--) {
            // 循环不变量: arr(i, n] 已局部排序
            // 循环体维持循环不变量: 将 arr[i] 插入合适的位置(也可以理解为调整 arr[i...n] 中与 i 绑定的逆序数对)
            E k = arr[i];
            int j;
            for (j = i; j + 1 < arr.length && k.compareTo(arr[j + 1]) > 0; j++) {
                arr[j] = arr[j + 1];
            }
            arr[j] = k;
        }
    }

    /**
     * 倒着排, 基于交换
     */
    public static <E extends Comparable<E>> void sort2(E[] arr) {
        for (int i = arr.length - 2; i >= 0; i--) {
            // 循环不变量: arr(i, n] 已局部排序
            // 循环体维持循环不变量: 将 arr[i] 插入合适的位置(也可以理解为调整 arr[i...n] 中与 i 绑定的逆序数对)
            for (int j = i; j + 1 < arr.length && arr[j].compareTo(arr[j + 1]) > 0; j++) {
                swap(arr, j, j + 1);
            }
        }
    }

    /**
     * 正着排, 基于交换
     */
    public static <E extends Comparable<E>> void sort1(E[] arr) {
        for (int i = 1; i < arr.length; i++) {
            // 循环不变量: arr[0, i) 已局部排序
            // 循环体维持循环不变量: 将 arr[i] 插入合适的位置(也可以理解为调整 arr[0...i] 中与 i 绑定的逆序数对)
            for (int j = i; j - 1 >= 0 && arr[j - 1].compareTo(arr[j]) > 0; j--) {
                swap(arr, j, j - 1);
            }
        }
    }
}

标签:arr,int,void,基础,static,排序,public
From: https://www.cnblogs.com/n139949/p/17302660.html

相关文章

  • List<Map<String, Object>> 排序
    一、代码publicclassTest{publicstaticvoidmain(String[]args){Map<String,Object>map=newHashMap<String,Object>();map.put("name","ZK");map.put("age",13);Map<Str......
  • python 基础练习
    f=3d=6#print(f>5ord>5)#print(not(d>5))#(f>5)andprint(111)#输出#print('我是好人%s'%('哈哈'))#name=input('请输入名字')#print('tamadhuaile%s'%(name))#if6>7:#print(222)#e......
  • 数组排序
    1#include<stdio.h>2voidsort1(ints[])3{4inti,j,t;5for(i=0;i<9;i++)6{7for(j=0;j<10;j++)8{9if(s[j]>s[j+1])10{11t=s[j];s[j]=s[j+1];s[j+1]=t;1......
  • java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
    复习资料:《同步与异步:并发/并行/进程/线程/多cpu/多核/超线程/管程 》基本线程类基本线程类基本线程类指的是Thread类,Runnable接口,Callable接口继承Thread创建线程继承java.lang.Thread类创建线程是最简单的一种方法,也最直接。publicclassMyThread1extendsThread{}种......
  • Golang基础-- select的用法
    select是golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready三个题目示例来说明一下select的大概作用:题目一:声明两个channel,分别为chan1和chan2,依次启动两个协程,分别向两个channel中写入一个数据就进入睡眠。select语句两个case分别检测chan1和chan2是......
  • rust基础(上)
    定义变量fnmain(){ letnumber=3; letfood="事物"; letcheck=true; println!("thenumberis:{}",number); println!("thefoodis:{}",food); println!("thecheckis:{}",check); //设定整形类型 letnumber2:i32=-300;//i32代表有符号......
  • SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
    目录数据库元数据查询7.5.1列出模式中所有的表7.5.2列出所有的数据库7.5.3列出给定表的基本信息7.5.4列出给定表的索引信息7.5.5列出给定表的主键、外键约束7.5.6列出给定表的外键引用7.5.7列出给定表的检查约束7.5.8列出给定表的默认约束7.5.9列出给定表的所有约束7.5.10......
  • NOI / 1.8编程基础之多维数组 04:错误探测
    描述给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。"改变矩阵元素"的操作定义为0变成1或者1变成0。输入输入n+1行,第1行为矩阵的大小n(0<n<100),以......
  • 第136篇:Three.js基础入门动画API:setInterval 与 requestAnimationFrame的区别
    好家伙,书接上文 functionanimate(){//请求-动画-框架requestAnimationFrame(animate);//改变正方体在场景中的位置,让正方体动起来cube.rotation.x+=0.01;cube.rotation.y+=0.01;renderer.render(......
  • 新手小白需要了解的 Go 基础细节杂谈
    今日记录一下学习golang这门语言遇到的一些比较特殊的细节,供大家参考。      所以,在我们输出内容的时候,可以包含很多的非ASCII码字符。实际上,Go是天生支持UTF-8的,任何字符都可以直接输出,甚至可以使用UTF-8中的任何字符作为标识符    _这个......