基本排序方式(一)冒泡排序和选择排序

1.冒泡排序

  • 基本思想(按升序来说)
    • 依次比较相邻两个数,将小的往前放,大的放后放,采用双层for循环,外层循环控制循环次数,负责遍历数组中每个数,内层循环负责比较。
    • 外层循环完成一趟,找到这组数中的最大值,放在数组最后。
  • 图解
数组a[]={112,34,57,1,90,123,23}。
  外层第一次循环:
    - 内层第一次循环 :34 ,112,57,1,90,123,23
    - 内层第二次循环 :34,57,112,1,90,123,23
    - 内层第三次循环:34,57,1,112,90,123,23
    ......
    - 内层最后一次循环:34,57,1,90,112,23,123 
  外层第二次循环:
    - 内层第一次循环:34,57,1,90,112,23,123
    - 内层第二次循环:34,1,57,90,112,23,123
    ......
     - 内层第最后一次循环:34,1,57,90,23,112,123
  ......
  外层最后一次循环:
        ......
    - 内层最后一次循环:1,23,34,57,90,112,123
  • 代码
package org.wetmo.demo1;
public class Demomaopao {
    public static void main(String[] args) {
        int[] arr ={112,34,57,1,90,123,23};
        show(arr);
    }
    public static void show(int a[]){
        for(int i=0;i<a.length-1;i++){
            for(int j=1;j<a.length-i;j++) {//对于已经排好的元素,不需要再进行排序,所以是a.length-i
                if(a[j-1]>=a[j]) {
                    int t = a[j-1];
                    a[j-1] = a[j];
                    a[j] = t;
                }
            }
        }
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

2.选择排序

  • 基本思想(按升序来说)

从头到尾扫描整个数组,找出数组中最小的数与数组中的第一个元素交换,再从剩下的数中找出最小的与数组中第二个元素交换,依次进行,直到排序完成。外层循环负责遍历整个数组,以及将内层循环比较得出的最小值与数组中元素交换,内层循环负责当前数组的最小值。

  • 图解
以此数组为例a[]={23,12,11,56,19,100,236,67};
第一次循环结束:11,12,23,56,19,100,236,67
第二次循环结束:11,12,23,56,19,100,236,67
第三次循环结束:11,12,19,56,23,100,236,67
......
最后一次:11,12,19,23,56,67,100,236
思路:我一开始想的是,设置最小值为min=a[i],将每次循环找出的最小值赋给min,再将a[i]与min的值交换,后来发现,这种方式是错误
的,因为在最后一步,交换值的时候,虽然将最小值已经赋给了数组的第一个元素,但是却把原来数组的第一个元素弄丢了,所以后来想
了一下,用数组的下标解决了这个问题。设置最小值为min=i;循环找出最小值的下表赋给min,然后再交换好了。(这些完全是笔者个人
的理解,仅供参考)。
  • 代码
package org.wetmo.demo1;
public class Demoxuanze {
    public static void main(String[] args) {
        int[] arr={23,12,11,56,19,100,236,67,};
        show(arr);
    }
    public static void show(int a[]){
        for(int i=0;i<a.length;i++){
            int min=i;
            for(int j=1+i;j<a.length;j++){
                if(a[min]>=a[j]){
                    min=j;
                }
            }
            int t=a[i];
            a[i]=a[min];
            a[min]=t;
        }
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值