zoukankan      html  css  js  c++  java
  • 排序算法

    • 冒泡排序
    • 插入排序
    • 快速排序
    • 选择排序
    • 希尔排序

    1冒泡排序

    1.1 原理

    每轮循环 多次两两比较选出一个最大的排在最后面

    冒泡排序

    1.2 原码

    /**
    * Description TODO 冒泡排序
    * Author Cloudr
    * Date 2020/4/1 22:43
    **/
    public class BubbleSort {
        private static void bubbleSorts(int[] a) {
    
            int i, j, temp;
    
            for (i = 0; i < a.length - 1; i++) {       //每轮都是把最大的数排到最后 注意是 a.length-1 因为下文有一个j+1
                for (j = 0; j < a.length - 1 - i; j++) { //每次需要排的个数减少i个
                    if (a[j] > a[j + 1]) {
                        temp = a[j + 1];
                        a[j + 1] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int[] a = {1, 253, 56, 745, 342, 41, 654, 321432, 131, 324};
            bubbleSorts(a);
            for (int i : a) {
                System.out.println(i);
            }
        }
    }
    

    1.3 复杂度

    * 时间复杂度
    



    2直接插入排序

    2.1 原理

    直接插入排序是将未排序的数据插入至已排好序序列的合适位置。

    具体流程如下:

    1、首先比较数组的前两个数据,并排序;

    2、比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;

    3、比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;

    ......

    4、直至把最后一个元素放入适当的位置。

    直接插入排序
    直接插入排序

    2.2 代码

    public class insertSort {
        private static void insertSort(int[] a) {
            int Temp;
            for (int i = 1; i < a.length; i++) { //注意是从i=1开始的
                Temp = a[i];                    //必须要用Temp 否则移动过程中会改变a[i]的值
                int j;
                for (j = i - 1; j >= 0; j--) {  //从已经排好的序列中的末尾(即最大的开始比较),即是从0~i-1与a[j]比较 
                    if (a[j] > Temp)
                        a[j + 1] = a[j];
                    else {
                        a[j + 1] = Temp; //因为之前j--了一次
                        break;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int[] a = {1, 2, 4, 623, 1, 132, 634, 2, 3, 4};
            insertSort(a);
            for (int i : a) {
                System.out.println(i);
            }
        }
    }
    



    3快速排序

    3.1原理简述

    • 找一个基准数,将大于这个基准数的数放在右边,小于它的放在其左边
    • 快速排序

    3.2源代码

        public class QuickSort {
    
            private static void quickSort(int[] a, int left, int right) {
        //        将a分成一边大的,一边小的,重复执行这个过程
                if (left < right) {
                    int index = getIndex(a, left, right);
                    quickSort(a, left, index - 1);
                    quickSort(a, index + 1, right);
                }
            }
    
            private static int getIndex(int[] a, int left, int right) {
    
                int standard = a[left]; // 基准数据
                while (left < right) {
                    while (left < right && a[right] >= standard) { //必须要 >= 不然 =等于那个得不到处理 left也指不到这边
                        right--;                                   // 当队尾的元素大于等于基准数据时,向前挪动high指针
                    }
                    a[left] = a[right];                            //将小于基准数据的值放到左边(小的一边)
                    while (left < right && a[left] <= standard) {
                        left++;
                    }
                    a[right] = a[left];                           //将大于基准数据的值放到右边(大的一边)
                }
                a[left] = standard;                               //此时left==right 同时这个位置也是standard的位置
                return left;
            }
    
            public static void main(String[] args) {
                int[] a = {1, 2, 4, 2, 21, 563, 1, 6246, 13, 4331};
                quickSort(a, 0, a.length - 1);
                for (int i : a) {
                    System.out.println(i);
                }
            }
        }
    



    4选择排序

    4.1原理简述:

    首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    • ![选择排序](

    4.2源代码

        public class SelectSort {
            private static void select(int[] a) {
                for (int i = 0; i < a.length; ++i) {
                    int index = i;
                    for (int j = i + 1; j < a.length; j++) {
                        if (a[index] > a[j]) {
                            index = j; // 找到当前循环中最小的数的索引
                        }
                    }
                    int temp = a[index];
                    a[index] = a[i];
                    a[i] = temp;
                }
            }
    
            public static void main(String[] args) {
    
                int[] a = {2, 1, 63, 2, 12, 7, 3, 12, 78, 6, 43};
                select(a);
                for (int i : a) {
                    System.out.println(i);
                }
    
            }
        }
    
    



    5希尔排序

    5.1原理简述

    希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

    ![希尔排序](

    5.2源代码

        public class ShellSort {
            private static void shell(int[] a) {
                int gap = a.length / 2;  //增量,每隔gap为一组
                while (gap >= 1) {
                    for (int i = gap; i < a.length; i++) { //依次遍历每一组 i=gap是因为后面的j-gap才有意义
                        int j = i;
                        while (j - gap >= 0 && a[j] < a[j - gap]) { //遍历每一组 如何发现后面的小于前面的则交换
                            int temp = a[j];                        //这里不采用每次给j+gap是因为 会有gap个a[j]遍历不到 换种方法也会比较麻烦
                            a[j] = a[j - gap];
                        a[j - gap] = temp;
    
                            j = j - gap;
                        }
                    }
                    gap = gap / 2;
                }
        }
    
            public static void main(String[] args) {
                int[] a = {3, 2, 5, 7, 43, 12, 15, 33, 15, 2, 12, 14, 3};
                shell(a);
                for (int i : a) {
                    System.out.println(i);
                }
            }
        }
    

    参考

  • 相关阅读:
    JAVA正则表达式matcher.find()和 matcher.matches()的区别
    Mysql面试题
    Mysql常见的错误码
    关于Spring的69个问题
    Exception总结
    JDK5-8特性归纳
    TCP和UDP的区别
    log4j介绍和使用
    tomcat项目中配置数据库连接池
    Mybatis简介、环境搭建和详解
  • 原文地址:https://www.cnblogs.com/ccink/p/13506927.html
Copyright © 2011-2022 走看看