Java排序

一、冒泡排序:

//冒泡排序:
public class BubbleSortDemo {
    public static void main(String[] args) {
        int[] arr = {90, 69, 6, 66, 55};

        //一、冒泡排序概述: 拿着相邻两个元素进行比较如果前边大就交换
        // (也可以后边大就交换-降序)(第j位和第j+1位比较<j不用等于最后一个元素的下标4>)
        // 比较一轮可以找出最大的数,比较第二轮可以找到第二大的数,4个数经过3轮比较就可
        //以排好序(4个数经过3轮比较,给3个数排好序<把大的往后交换>,剩下的那个就是最小的)

        //二、和插入排序版本2比较:
        //A.冒泡排序是不用管后边排好顺序的, 版本2这种
        //插入排序是不用管后边还未插入的数(比如第一次的,1,4)
        //B.不过过程和代码都比较相似(有些像倒着写的冒泡排序):
        //冒泡排序的if条件不能合并到循环条件中,插入排序的if条件可以合并到循环条件中


//        //{90, 69, 6, 66, 55}
//        //1.求数组中的最大值: 拿着相邻两个元素进行比较如果前边大就交换
//        //经过j=0,j=1,j=2,j=3四次交换,最后把90交换到最后成了 69,6,66,55,90
//        for (int j = 0; j < 4; j++) {
//            if(arr[j]>arr[j+1]){
//                int t=arr[j];
//                arr[j]=arr[j+1];
//                arr[j+1]=t;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//
//        //[69, 6, 66, 55,| 90]//上一轮已经给90找好位置了
//        //2.求69, 6, 66, 55中的最大值: 拿着相邻两个元素(第j位和第j+1位比较)进行比较
//        //如果前边大就交换(但是排除第4位的90,j最大取2)
//        //经过j=0,j=1,j=2三次交换,最后把69交换到90前边了,最后成了 6,66,55,69,90
//        for (int j = 0; j < 3; j++) {
//            if(arr[j]>arr[j+1]){
//                int t=arr[j];
//                arr[j]=arr[j+1];
//                arr[j+1]=t;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//
//
//        //[6, 66, 55, |69, 90]//上两轮已经给69,90找好位置了
//        //3.求6, 66, 55中的最大值: 拿着相邻两个元素(第j位和第j+1位比较)进行比较
//        //如果前边大就交换(但是排除第3位的69和第4位的90,j最大取1)
//        //经过j=0,j=1 两次交换,最后把66交换到69前边了,最后成了 6,55,66,69,90
//        //注意:这里j=0时用6和66比较发现不需要交换,此时还不能结束比较(不能结束循环)
//        //因为还要拿66和55比较,所以不能把arr[j]>arr[j+1]合并到循环条件中。
//        for (int j = 0; j < 2; j++) {
//            if(arr[j]>arr[j+1]){
//                int t=arr[j];
//                arr[j]=arr[j+1];
//                arr[j+1]=t;
//            }
//        }
//        System.out.println(Arrays.toString(arr));
//
//
//        //[6, 55, |66, 69, 90]//上三轮已经给66,69,90找好位置了
//        //4.求6, 55中的最大值: 拿着相邻两个元素(第j位和第j+1位比较)进行比较
//        //如果前边大就交换(但是排除第2位的66第3位的69和第4位的90,j最大取0)
//        //经过j=0 一次交换,没有交换,最终6, 55, 66, 69, 90就是升序排列的结果
//        for (int j = 0; j < 1; j++) {//如果要降序排列就把arr[j]>arr[j+1]
//            if(arr[j]>arr[j+1]){     //改成arr[j]<arr[j+1]//把小的往后交换
//                int t=arr[j];
//                arr[j]=arr[j+1];
//                arr[j+1]=t;
//            }
//        }
//        System.out.println(Arrays.toString(arr));


        //最终经过4轮比较对数组升序排序了
        //(第零轮比较了4次,第一轮比较了3次,第二轮比较了2次,第三轮比较了1次,)
        //冒泡排序最终代码:
        for(int i=0;i<4;i++) { //i=0 j=4    i=1 j=3   i=2 j=2    i=3 j=1
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));//

    }
}

二、插入排序:

版本1:

public class BubbleSortDemo {
    public static void main(String[] args) {
        int[] arr = {90, 69, 6, 66, 55};

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 99);
        }
        System.out.println(Arrays.toString(arr));

/*        //  {90,|69,6,66,55};
        //在第一部分90给69找合适位置(如果后边的69小,就把前边的90 往后复制变成90,90,
        //然后把小的69插入到合适位置<90原本的位置>,变成69,90)
        int i1,j1,t1=arr[1];
        for(j1=0;j1>=0&&arr[j1]>t1;j1--){
            arr[j1+1]=arr[j1];
        }
        arr[j1+1]=t1;



        //  {69,90|,6,66,55};
        //在第一部分69,90给6找合适位置(如果后边的6小,就把前边的69和90 往后复制,先复制90
        //变成69,90,90; 再复制69变成69,69,90;
        // 最后把小的6插入到合适位置<69原本的位置>,变成6,69,90)
        int i2,j2,t2=arr[2];
        for(j2=1;j2>=0&&arr[j2]>t2;j2--){
            arr[j2+1]=arr[j2];
        }
        arr[j2+1]=t2;


        //  [6, 69, 90|, 66, 55]
        //在第一部分6, 69, 90给66找合适位置(如果后边的66小,就把前边的69和90 往后复制,先
        //复制90变成6,69,90,90; 再复制69变成6,69,69,90;
        //最后把小的66插入到合适位置<69原本的位置>,变成6,66,69,90)
        int i3,j3,t3=arr[3];
        for(j3=2;j3>=0&&arr[j3]>t3;j3--){
            arr[j3+1]=arr[j3];
        }
        arr[j3+1]=t3;



        //  [6, 66, 69, 90|,55]
        //在第一部分6, 66, 69, 90给55找合适位置(如果后边的55小,就把前边的66,69和90 往后复制,
        //先复制90变成6,66,69,90,90; 再复制69变成6,66,69,69,90;
        //再复制66变成6,66,66,69,90;最后把小的55插入到合适位置<66原本的位置>,变成
        //6,55,66,69,90)
        int i4,j4,t4=arr[4];//在5行代码外边再增加一个外层for训啊还,来控制"t2=arr[4]" 中
        //方括号中的4 和  "j3=3"中的3的改变 实现将四个循环总结为一个循环
        for(j4=3;j4>=0&&arr[j4]>t4;j4--){//如下边的循环
            arr[j4+1]=arr[j4];
        }
        arr[j4+1]=t4;*/


        //插入排序最终代码
        for (int i = 1; i < arr.length; i++) {
            int j, t = arr[i];
            for (j = i - 1; j >= 0 && arr[j] > t; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = t;
        }
        System.out.println(Arrays.toString(arr));
    }
}

版本2:


//插入排序
public class InsertSortDemo {
    public static void main(String[] args) {
        //int [] a={9,3,1,4};
        int [] a={1,9,4,5};



        //一、过程概述:
        //把数组分为两部分,前半部分是排好序的,后半部分是待排序的。
        //拿着后半部分的每个数去前半部分中找到合适位置插入(和前半部分的每个数比较,
        //如果比前半部分被比较的数小就交换)

        //二、和插入排序版本2比较:
        //A.冒泡排序是不用管后边排好顺序的, 版本2这种
        //插入排序是不用管后边还未插入的数(比如第一次的,1,4)
        //B.不过过程和代码都比较相似(有些像倒着写的冒泡排序):
        //冒泡排序的if条件不能合并到循环条件中,插入排序的if条件可以合并到循环条件中
        

//        //  {1|,9,4,5}
//        //1.在第一部分1给9找合适位置插入(如果后边的9小,就和前边的1交换)
//        for(int j=1;j>=1;j--) {
//            if(a[j]<a[j-1]) {
//                int t = a[j];
//                a[j] = a[j - 1];
//                a[j - 1] = t;
//            }
//        }
//        System.out.println(Arrays.toString(a));
//
//
//        //  {1, 9|, 4, 5}
//        //2.在第一部分1,9给4找合适位置插入(如果后边的4小,就和前边的数交换,变成1,4,9
//        for(int j=2;j>=1;j--) {
//            if(a[j]<a[j-1]) {
//                int t = a[j];
//                a[j] = a[j - 1];
//                a[j - 1] = t;
//            }
//        }
//        System.out.println(Arrays.toString(a));
//
//
//
//        //  {1,4,9|,5}
//        //3.在第一部分1,4,9给5找合适位置(如果后边的5小,就和前边的数交换,变成1,4,5,9
//        //因为5和9比较发现需要交换(把5插入到9前边)变成1,4,5,9,然后拿5和4比较发现不需要
//        //交换此时就可以结束比较了(把a[j]<a[j-1]合并到循环条件中来终止循环的执行)
//        //(因为每次是把小的往前放,既然5比4大不能放到4的前边,那肯定也不能放到1的前边了
//        //<因为4的前边都比4小>)
//      /*for(int j=3;j>=1;j--) {
//            if(a[j]<a[j-1]) {
//                int t = a[j];
//                a[j] = a[j - 1];
//                a[j - 1] = t;
//            }
//        }
//        System.out.println(Arrays.toString(a));*/
//        //把a[j]<a[j-1]合并到循环条件中之后的代码
//        for(int j=3; j>=1 && a[j]<a[j-1]; j--) {
//                int t = a[j];
//                a[j] = a[j - 1];
//                a[j - 1] = t;
//        }
//        System.out.println(Arrays.toString(a));



        //插入排序最终代码
        for (int i = 1; i < a.length; i++) {
            for(int j=i; j>=1 && a[j]<a[j-1]; j--) {
                int t = a[j];
                a[j] = a[j - 1];
                a[j - 1] = t;
            }
        }
        System.out.println(Arrays.toString(a));

    }
}

选择排序,快速排序,希尔排序,堆排序等其他排序方式自己找资料学习

-------------------------------------------------

zhaoyq-2022-03-08 14:25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值