两种基本排序

1.冒泡排序法

整体思路

冒泡排序法就是将 一堆数 从前往后 两个两个 逐个扫描,两个数将大的数放到后边,这样扫一遍,就可以在这堆末尾排好一个数(你可以理解为从前往后扫,把大的数从后依次往前排),仔细观察,扫描一次,排好一个数,有十个数,扫九次就排好了,(别问为什么是九次,你想想后面九个数排好了第一个数还用排吗)所以编程首先要有一个for循环在最外层for(i=0;i<9;i++)来控制扫描的遍数,其次你要往过“扫”啊,这个“扫”的过程也就是两个数两个数比较排列的过程,所以要在前面的for循环里再放一个for循环for(i=0;i<9-n;i++),用这个for循环往后扫,在这个循环里用if语句判断,如果前一个数大于后面那个数,就交换两个数。

public class Bubbling {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n,i;
        int[] arr=new int[10];
        System.out.println("Please enter ten numbers:");
        for ( i = 0; i < arr.length; i++) {
            arr[i]=sc.nextInt();//通过循环给数组输入十个数
        }
        System.out.println();//换行
        for(n=0;n<9;n++){  //这个循环是整体扫描十个数的次数,扫一次排好一个数,扫九次
            for(i=0;i<9-n;i++){
                //这里控制扫描的过程
                //这个i<9-n是控制扫描的这堆数的哪里
                //因为扫一次在末尾排好一个数,排好的数不用扫了,所以需要扫描的数少一位
                if (arr[i] > arr[i+1]) {
                    int temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
        }
        for(i=0;i<10;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

2.选择排序法

整体思路

选择排序法是将一堆数,从前往后逐个扫描

比如说有十个数,从前往后扫描一遍就在前面排好了一位数

那么要排好十个数就要扫描九遍,这样就需要在最外层放一个大循环,控制扫描九次

在扫描一遍的过程需要从前往后边扫描要边记录最小的那个值,最后一步进行替换

在大循环里,也就是从前往后扫描一遍,这需要另一个小循环,从前往后一个一个的读数据

这里要注意写代码的细节:因为在前面排好一个数这个数就不用扫描了,也就是每次扫描的起点是上一次扫描的后一位数,那么在写代码的时候就要注意让小循环循环的起点从上次排好的位置开始

这个小循环在控制从前往后读数的同时也要比较记录最小的数

然后在扫描一遍完毕后,要进行数字交换,将最小数放到此次扫描的最前面,也就是和此次扫描最前面的那个数交换,而最前面的那个数就要在每次扫描之前标记好,所以要在大循环下紧跟一个k=i(仔细观察就会发现大循环第一次循环时扫描是从第一个数开始的,第二次循环扫描是从第二个数开始的,所以k=i)

public class Select {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int i,j,k;
        int[] arr=new int[10];
        System.out.println("Please enter ten numbers:");
        for ( i = 0; i < arr.length; i++) {
            arr[i]=sc.nextInt();
        }
        System.out.println();
        for (i = 0; i <9 ; i++) {//十个数总共要扫描九次
            k=i;//定位好每次排好数的位置
            for(j=i+1;j<10;j++){
                //每次从上次排好的数开始扫描,j=i+1第一个数就不用自己和自己比较了
                if(arr[j]<arr[k]) {
                    k = j;   //比较大小,记忆小的那个数组的下标
                }
            }
            if(k!=i) {
                int temp = arr[k];//扫描完一遍后就将最小的那个数换到前面
                arr[k] = arr[i];
                arr[i] = temp;
            }            
        }
        for ( i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值