今日总结之排序算法

冒泡排序

冒泡排序,外循环确定比较的次数。内循环里第一个数和第二个数进行比较,如果第一个数大于第二个数就交换两数的位置(降序交换,升序相反),当第二个数交换完之后和第三个数比较,然后依次类推。第一次排序完之后就会确定第一大的数字,然后执行数组长度减一次之后所有的数字就都排序好了。

package com.kfm.base.sort;

import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        int[] a = {3, 2, 55, 33, 76, 48, 9, 20, 66};


        for (int i = 0; i < a.length - 1; i++) { //外层循环表示比较的次数
            for (int j = 0; j < a.length - 1 - i; j++) { //内层循环表示要和多少个数字进行比较
                if (a[j + 1] < a[j]) { //用一个数和他的前一个数进行比较
                    //如果前一个数比当前位置的数大就交换位置
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
}

这是排序完成后的结果
动图如下

插入排序

插入排序就是暂定第一个数顺序已排好,然后用第二个数与之比较,如果第二个数小于第一个数就纪录位置,第一次排序结束,然后第一个数后移,将第二个数赋值刚才标记的位置,以此类推,当为第n个数时,与前n减一个数比较,当到小于第n个数时,n到那个数之间的数都要后移。然后将第n个数赋值给标记的那个位置。

package com.kfm.base.sort;

import java.util.Arrays;

public class Insertion {
    public static void main(String[] args) {
       	int[] arr = {3, 5, 2, 8, 9, 6};
        for (int i = 1; i < arr.length; i++) {
            int current = arr[i]; //取第i个数
            int preIndex = i - 1; //取第i+1个数的下标

            while (preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex + 1] = arr[preIndex]; //如果第i个后面的数大于第i个数,第i个数后移
                preIndex--;//减减是为了能和前面的数比较
            }

            arr[preIndex + 1] = current;  //将这个用于比较的数赋值给比较完后小于这个数的前面一个数
        }

        System.out.println(Arrays.toString(arr));
    }
}

运行结果如下
动图如下
在这里插入图片描述

选择排序

外层循环控制比较数字的多少,内层遍历没有和前面的数没有比较过的数字,当找到比当前数还小的数字时,记录下标,找到更小的更新下标,循环结束把当前数和记录下标的数字交换位置。

package com.kfm.base.sort;

import java.util.Arrays;

public class Selection {
    public static void main(String[] args) {
        int[] a = {3, 2, 55, 33, 76, 48, 9, 20, 66};
        for (int i = 0; i < a.length - 1; i++) { //从第一个数开始比较
            int min = i;
            for (int j = i + 1; j < a.length; j++) { //内层循环遍历i+1到最后一个数
                if (a[j] < a[min]) {
                    min = j; //标记找到的数
                }
            }
            int temp = a[min]; //和找到的数交换位置
            a[min] = a[i];
            a[i] = temp;
        }
        System.out.println(Arrays.toString(a));
    }
}

这里是运行结果
动图如下
在这里插入图片描述

二分查找

二分查找必须限定排好序的数组,将第一位下标和最后一位下标作为标志量,设定一个middle中间下标量,将要查找的数和数组middle下标的数字相比较。如果数组升序,数组的middle下标数大于要查找的数,说明middle在要找的数左边,然后左边的标志量右移至middle右边一位。数组的middle下标数小于要查找的数,说明middle在要找的书的右边,右边的标志量左移到middle左边一位。

package com.kfm.base.sort;

public class Binarysearch {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
        int n = 5; //你要查找的数
        int left = 0; //第一个数的下标
        int right = a.length - 1; //最后一个数的下标
        int index = -1; //定义一个标志量
        while (left <= right) {
            int middle = (left + right) >> 1; //定义一个中值下标
            if (a[middle] == n) {
                index = middle; //如果a[middle]等于n,说明找到了
                break;
            } else if (a[middle] < n) {
                left = middle + 1; //当a[middle]<n时,说明middle在要找的数左边,然后左边的标志量右移至middle右边一位
            } else
                right = middle - 1; //当啊a[middle]>n时,说明middle在要找的书的右边,右边的标志量左移到middle左边一位
        }
        System.out.println(index);
    }
}

运行结果在这里
动图如下
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值