zoukankan      html  css  js  c++  java
  • 十大常见排序算法

    一、排序算法概述

    排序算法最常用操作:交换元素

    public void sort(int[] arr, int i, int j){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
        }

    二、冒泡排序

    2.1 实现原理

    第一种:元素上浮,从右(大)往左(小)依次确认,相邻元素间,如果右小于左,则交换,每次确认一位最小数。

    第二种:元素下沉,从左(小)往右(大)依次确认,相邻元素间,如果左大于右,则交换,每次确认一位最大数。

    2.2 动图解析

    3.3 代码实现

    public static void main(String[] args) {
            Object [] arr = {23,42,21,33,44,55,34,65,77,20,"A","b",90};
            for (Object o : bubbleSort(arr)) {
                System.out.print(o+" ");
            }
    }
    public static Object[] bubbleSort(Object[] arr){ //排除空异常 if (arr == null || arr.length == 0) { return arr; } //从末尾元素开始确定 for (int i = arr.length - 1; i > 0; i--) { //判断是否存在交换 boolean flag = false; for (int j = 0; j < i; j++) { if (arr[j].hashCode() > arr[j + 1].hashCode()) { sort(arr, j, j + 1); flag = true; } } //如果不再存在交换,则排序完毕,直接退出 if (!flag) { break; } } return arr; }

    结果:

    三、选择排序

    3.1 实现原理

    第一种:拿未确认的最左位元素,依次和右边元素比较,如果右边元素更小,则交换

    第二种:拿未确认的最右位元素,依次和左边元素比较,如果左边元素更大,则交换

    3.2 动图解析

    3.3 代码实现

    public static Object[] selectSort(Object[] arr){
            //排除空异常
            if (arr == null || arr.length == 0) {
                return arr;
            }
            //从第一位元素开始确定
            for (int i = 0; i < arr.length - 1; i++) {
                //记录当前获得最小值的索引(取代实际交换操作)
                int min = i;
                for (int j = i + 1; j < arr.length; j++) {
                    if (arr[j].hashCode() < arr[min].hashCode()) {
                        min = j;
                    }
                }
                sort(arr, i, min);
            }
            return arr;
        }

     结果:

    四、插入排序

    4.1 实现原理

    将某一元素插入已经排序好的数组中,

    第一种:元素位于数组右方,则元素依次与左方比较,找出合适位置,被比较元素后移一位,该元素前置

    第二种:元素位于数组左方,则元素依次与右方比较,找出合适位置,被比较元素前移一位,该元素后置

    4.2 动图解析

     

    4.3 代码实现

    private static Object[] insertSort(Object[] arr) {
            //排除空异常
            if (arr == null || arr.length == 0) {
                return arr;
            }
            //从第二位开始,比较元素前面的元素为排序好的数组
            for (int i = 1; i < arr.length; i++) {
                Object temp = arr[i];
                //定义被比较数组元素所在位
                int j = i - 1;
                while (j >= 0 && temp.hashCode() < arr[j].hashCode()) {
                    arr[j + 1] = arr[j];
                    j--;
                }
                //将插入元素前置
                arr[j + 1] = temp;
            }
            return arr;
        }

    结果:

    五、希尔排序

    5.1 实现原理

    按照一定间隔(记d)执行插入排序

    第一种:元素位于数组右方,记索引为x,则元素依次与左方x-d的元素比较,找出合适位置,被比较元素后移一位,该元素前置

    第二种:元素位于数组左方,记索引为x,则元素依次与右方x+d的元素比较,找出合适位置,被比较元素前移一位,该元素后置

    5.2 动态解析

    5.3 代码实现

    private static Object[] shellSort(Object[] arr) {
            //排除空异常
            if (arr == null || arr.length == 0) {
                return arr;
            }
            //假定初始间隔为数组长度二分之一,每次再乘以二分之一
            int len = arr.length / 2;
    
            while (len != 0) {
                for (int i = len; i < arr.length; i++) {
                    Object temp = arr[i];
                    //获取与比较元素间隔len长度的数组元素
                    int j = i - len;
                    //插入排序
                    while (j >= 0 && (temp.hashCode() < arr[j].hashCode())) {
                        arr[j + len] = arr[j];
                        j = j - len;
                    }
                    arr[len + j] = temp;
                }
                len = len / 2;
            }
            return arr;
        }

    结果:

    更多详细见解:https://blog.csdn.net/qq_35813653/article/details/83055078

  • 相关阅读:
    匹配域名
    异步加载js文件
    Python3.X BeautifulSoup([your markup], "lxml") markup_type=markup_type))的解决方案
    CSDNmarkdown编辑器直接写代码的小效果(一生愿)
    JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)
    JAVA_OA(十四):SSM练手项目bug-Oracle分页web页面无法转到下一页
    JAVA_OA(十四):SSM练手项目bug-JSP页面传递参数的编码问题
    JAVA_OA(八):springMVC对JDBC的操作小项目b
    完全卸载oracle11g教程、Oracle11g的卸载方法和步骤
    JAVA_OA(八):springMVC对JDBC的操作小项目a
  • 原文地址:https://www.cnblogs.com/Qi1007/p/9800478.html
Copyright © 2011-2022 走看看