zoukankan      html  css  js  c++  java
  • 【冒泡排序,简单选择排序,直接插入排序——努力回忆中】

    关于冒泡排序

    大体思想就是对于一队数字,相邻数字通过比较两两交换,实现从小到大或者从大到小排列。利用两个for循环实现,执行内层for循环可以理解为进行一趟比较,每次比较都可以从无序序列中将一个max或者min值交换到首或者尾(想从大到小排列,就每次比较的时候将较小的[i]交换至[i+1]处,反之同理),外层for循环就是执行数趟,直到全部比较结束(添加flag做标志的话就可以减少一些比较次数,在数列第一次基本有序时就跳出循环~)

    import java.util.Arrays;
    
    public class MaoPao {
        public static void main(String[] args) {
    
            MaoPao maoPao = new MaoPao();
            int[] a= {23,46,1,89,43,22,23,44,3};
            //maopaosort(a);
            int [] maopaosort = maoPao.maopaosort(a);
            //System.out.println(Arrays.toString(maopaosort));//可以直接输出数组
            //或者用循环
           for (int num: maopaosort) {
                System.out.print(num+"\t");
            }
    
    
    
        }
        public int [] maopaosort(int [] b) {
    
            int temp = 0;
            for (int i = 0; i < b.length - 1; i++) {
                int flag = 0;//标记无序
                for (int j = 0; j < b.length - 1 - i; j++) {
                    if (b[j] >= b[j + 1]) {//若左大右小,则data交换
                        temp = b[j];
                        b[j] = b[j + 1];
                        b[j + 1] = temp;
                        flag = 1;//标记有序
    
                    }
                }
    
                if (flag == 0) {//完成某趟排序后发现已经基本有序,就跳出
                    break;
                }
    
            }
            return b;
    
        }
    
    }

    关于简单选择排序

    思想:每一趟都能找出一个当前最小值,比如第一趟找到的最小值放在a[0],第二趟找到的次小值就放在a[1],以此类推,这种算法在数列中有相同关键字有序的时候很不稳定,因为交换后会破坏原有关键字的前后顺序,比如1,3,3,2, ,3和2比较,如果有多个3就只能把第一个3换过去,排序后:1,2,3,3 但是原来的 3,3变为3,3,相对位置改变了,现在前后颠倒(虽然看起来一样hh)

    public class SelectSort{
    
    
        public int[] sort(int arr[]) {
            int temp = 0;
            for (int i = 0; i < arr.length - 1; i++) {
                // 认为目前的数就是最小的, 记录最小数的下标
                int minIndex = i;
                for (int j = i + 1; j < arr.length; j++) {
                    if (arr[minIndex] > arr[j]) { // 修改最小值的下标
                         minIndex = j;
                    }
                }
                // 当退出for就找到这次的最小值,就需要交换位置了
                if(i != minIndex) {
                        temp = arr[i];
                        arr[i] = arr[minIndex];
                        arr[minIndex] = temp;
                }
                    }
            return arr;
                }
    
        public static void main(String[] args) {
            SelectSort selectSort = new SelectSort();
            int[] array = {2,5,1,6,4,9,8,5,3,11,2,0};
            int[] sort = selectSort.sort(array);
            for (int num:sort){
                System.out.print(num+"\t");
            }
        }
    
    }

    关于直接插入排序

    思想:虽然叫直接插入但并不涉及手动插入,而是像整理扑克牌一样,一般我们都习惯将牌升序或者降序排列来方便出牌(也有人会用别的方法,我就是举个栗子)

    发牌后发现基本都是乱序,假设我们从左开始理牌,想要让牌从小到大排列。依然是比较思想,先用第二张和第一张比较,然后就是第三张和前两张比较,看起来和选择排序有些像,

    用例子说明:

    发牌后手中牌:2,6,3,1,13,7,2

    第一趟:2,6,3,1,13,7,2       无交换

    第二趟:2,3,6,1,13,7,2      3和6交换

    第三趟:1,2,3,6,13,7,2   1先和6交换,然后发现1还可以和3交换,交换后,又双叒发现能和2交换,于是就是第三趟排序后就是前面那样子;

    第四趟:1,2,3,6,13,7,2    无交换

    第五趟:1,2,3,6,7,13,2    7和13交换

    第六趟:1,2,2,3,6,7,13    2和13交换,然后2又和7,交换,....交换............最后和3交换,完成排序 

    所以,和选择排序还是很有区别的,选择排序是只找当前最小值,然后不断放在序列头部,直接插入虽然也是头部有序,但并不一定是每一趟都能固定好关键字的位置,

    简单选择每趟排序都能确定一个关键字的位置,直到最后一趟结合素其位置都不会改变,这点我记得在数据结构中会经常考察。

    public class InsertSort {
        private int[] sort(int[] arr) {
            //如果传入的数组为空或者只有一个值,就直接返回
            if (arr == null || arr.length < 2) {
                return arr;
            }//不为空则进循环判断
            // 外层循环控制总数量
            for (int i = 1; i < arr.length; i++) {
                //内层循环依次减少并提出结果
                for (int j = i; j > 0; j--) {
                    //如果当前数字小于前一个,则交换,否则不变
                    if (arr[j] < arr[j - 1]) {
                        int temp = arr[j];
                        arr[j] = arr[j - 1];
                        arr[j - 1] = temp;
                    } else {
                        break;
                    }
                }
            }
            return arr;
        }
    
    
        public static void main(String[] args) {
            InsertSort insertSort = new InsertSort();
            int[] array = {2, 5, 1, 6, 4, 9, 8, 5, 3, 1, 2, 0};
            int[] sort = insertSort.sort(array);
            for (int num : sort) {
                System.out.print(num + "\t");
            }
        }
    }
  • 相关阅读:
    maven
    ELK
    gitlab 升级
    平安工作流程
    平安云应用场景
    nginx基于uwsgi部署Django (单机搭建)
    ansible
    nginx理论
    GIT
    docker(三)
  • 原文地址:https://www.cnblogs.com/dabuliu/p/14422726.html
Copyright © 2011-2022 走看看