zoukankan      html  css  js  c++  java
  • 冒泡、选择、插入和希尔排序

    冒泡排序

    public class BubbleSort {
        /*
           基本思想:
           通过对待排序序列从前往后(从下标较小的元素开始),依次比较相邻两元素的值,若发现逆序则交换,
           使值较大的元素逐渐从前面移向后部。
           以从小到大为例:每一趟都确定一个当前最大数的位置,共走n-1趟。
         */
        public static  void bubbleSort(int[] arr){
            //临时变量,用来交换数组不同位置的两个数
            int temp = 0;
            //优化效率的一个标志
            boolean flag= false;
    
            for(int i=0;i<arr.length-1;i++){
                for (int j = 0; j <arr.length-1-i; j++) {
                    //“-i"每一轮冒泡以后最大数已经就位,没有必要重复比较
                    if(arr[j]>arr[j+1]){
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                        //在该轮中如果进行过交换则将flag更改为true
                        // (如果flag一次都没有进行过交换则为false,证明此时数组已经是一个有序数组,可以直接退出程序)
                        flag=true;
                    }
                }
                if(!flag){
                    break;
                }else {
                    flag=false;
                }
            }
        }
    }

    选择排序

    /*
        基本思想:
            第一次从arr[0]-—arr[n-1]中找到最小的数与arr[0]交换;第二次从arr[1]--arr[n-1]
        中找到最小的数与arr[1]交换,以此类推,直到完成排序。
        说明:
        1.选择排序一共有数组大小-1次排序;
        2.每一轮排序都是一个循环
            2.1先假定当前这个数最小;
            2.2然后和后面的每个数进行比较,如发现比前面更小的数就重新确定最小数并确定下标;
            2.3当打到最后时,就找到了本轮的最小数;
            2.4进行交换。
         */
        //时间复杂度O(n2)
        public static void selectSort(int[] arr){
            for(int i=0;i<arr.length-1;i++){
                int minIndex = i;
                int min = arr[i];
                //(i+1)从上一轮的下一个开始选择
                for(int j=i+1;j<arr.length;j++){
                    if(min>arr[j]){
                        //找到本轮的最小数和他的下标
                        min=arr[j];
                        minIndex=j;
                    }
                }
                //交换
                if(minIndex!=i){
                    arr[minIndex] = arr[i];
                    arr[i]=min;
                }
    
            }
        }
    }

    插入排序

    public class InsertSort {
        /*
        简单插入排序是对于欲排序的元素已插入的方式找到该元素的位置,以达到排序的目的
        基本思想:
            把n个待排序的元素看成一个有序表和无序表
            开始时有序表中只有一个元素,无序表中有n-1个元素,排序过程中每一次从无序表
        中取出第一个元素,把他的排序码与有序表中的排序码依次进行比较,将它插入到有序表
        中的适当位置,使之成为新的有序表。
         */
        public static void insertSort(int[] arr){
            for(int i=1;i<arr.length;i++){
                int value = arr[i];//待插入的数
                int Index = i-1;//待插入数的前一个数的坐标(待插入数与有序表中第一个数比较的下标)
                //保证不越界  待插入数的位置还没有找到
                while(Index>=0&&value<arr[Index]){
                    //将比待插入数大的移到正确的位置
                    arr[Index+1] = arr[Index];
                    //继续与下一个比较
                    Index--;
                }
                //位置找到,并完成插入
                arr[Index+1]=value;
            }
        }
    }

    希尔排序

    /*
        也是一种插入排序
        简单插入排序的问题:如果较小的数排在后面,那么厚仪的次数明显增加,会影响效率
    
        希尔排序的基本思想:
            把数组按下标的一定增量分组,对每一组使用直接插入排序算法排序;随着增量
         逐渐减少,每组包含的关键词与来越多,当增量减少到1时,完成最后一次简单插入排序
         算法结束。
         */
    
        //交换法
        public static void shellSort(int[] arr) {
            int temp = 0;
            for(int gap = arr.length / 2; gap > 0; gap /= 2) {
                for(int i = gap; i < arr.length; ++i) {
                    for(int j = i - gap; j >= 0; j -= gap) {
                        if (arr[j] > arr[j + gap]) {
                            temp = arr[j];
                            arr[j] = arr[j + gap];
                            arr[j + gap] = temp;
                        }
                    }
                }
            }
        }
        //位移法{(效率较高)
        public static void shellSort2(int[] arr) {
            //所谓的增量就是分为几组,在这里就是gap在逐步减小
            for(int gap = arr.length / 2; gap > 0; gap /= 2) {
    
                //遍历各组中的所有元素,一改组下标最大的元素为起点
                for(int i = gap; i < arr.length; i++) {
                    int j = i;
                    int temp = arr[i];
                    if (arr[i] < arr[i - gap]) {
                        while(j - gap >= 0 && temp < arr[j - gap]) {
                            arr[j] = arr[j - gap];
                            j -= gap;
                        }
                        arr[j] = temp;
                    }
                }
            }
    
        }
    }
  • 相关阅读:
    asp.net core MVC 入门学习
    C# 中关于重载与重写的区别及用法
    C# 生成随机的6位字母,包含大小写
    C# CheckBoxList绑定值,设置及获取
    jquery中checkbox的全选与反选
    docker 执行 docker system prune 导致Azure Devops build镜像失败
    Navicat 连接mysql 报错: Authentication plugin caching_ sha2_password cannot be loaded
    docker build 错误 /usr/share/dotnet/sdk/2.1.801/Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3245: Could not resolve this reference
    Azure Devops: COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx.csproj no such file or directory
    Azure DevOps vsts-agent-linux 安装出错, Must not run with sudo
  • 原文地址:https://www.cnblogs.com/susexuexi011/p/14140333.html
Copyright © 2011-2022 走看看