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

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/Qi1007/p/9800478.html
Copyright © 2011-2022 走看看