Java基础算法(插入、选择、冒泡、快排)

一、直接插入排序

1、原理:从待排序的数中选出一个来,插入到前面的合适位置。
2、适用场景:基本有序的数据
3、代码实现:
    static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};

    public static void insertSort() {
        int tmp, i = 0;
        // 遍历数组
        for(int j = 0; j<data.length; j++) {
            // 依次取出每个数放入tmp
            tmp = data[j];
            // 将取出的数与之前面一个比较
            i = j - 1;
            // 若小于前面一个数,则将前面一个数后移(覆盖取出来的这个数的位置)
            while(i >= 0 && tmp < data[i]) {
                data[i+1] = data[i];
                // 继续和再前面一个数比较
                i--;
            }
            // 将取出的数插入
            data[i+1] = tmp;
            System.out.println();
            print();
        }
    }

二、选择排序

1、原理:与直接插入排序正好相反,选择排序是从待排序的数中选出最小的放在已经排好的后面,这个算法选数耗时
2、代码实现:
    static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};

    public static void selectSort() {
        // i, j, k未初始化
        int i, j, k, tmp = 0;
        // 遍历数组,从i开始的length-1个数
        for(i=0; i<data.length-1; i++) {
            // 设置k的值和i一致
            k = i;
            // 遍历数组,从i+1开始的length-1个数
            for(j=i+1; j<data.length; j++) {
                // 如果后一个数比前面一个数小
                if(data[j] < data[k]) {
                    // 则把后一个数的坐标赋予k(保持k坐标的数为当前轮最小数)
                    k = j;
                }
            }
            // 若发生后一个数比前一个数小的情况,则交换
            if(k != i) {
                // 交换
                tmp = data[i];
                data[i] = data[k];
                data[k] = tmp;
                System.out.println();
                print();
            }
        }
    }

三、冒泡排序

1、原理:小的数一点一点向前起泡,最终有序。
2、代码实现:
    static int data[] = {12, 6, 17, 108, 97, 93, 256, 1024};

    public static void bubbleSort() {
        int i, j, tmp = 0;
        // 遍历从i开始的length-1个数
        for(i=0; i<data.length - 1; i++) {
            // 依次比较相邻两个数
            for(j=data.length - 1; j>i; i--) {
                // 若后者小于前者,则换位
                if(data[j] < data[j-1]) {
                    tmp = data[j];
                    data[j] = data[j-1];
                    data[j-1] = tmp;
                }
            }
        }
    }

四、快速排序

1、原理:设置两个指针:i和j,分别指向第一个和最后一个,i像后移动,j向前移动,选第一个数为标准(一般这样做,当然快排的关键就是这个“标准”的选取),从后面开始,找到第一个比标准小的数,互换位置,然后再从前面,找到第一个比标准大的数,互换位置,第一趟的结果就是标准左边的都小于标准,右边的都大于标准(但不一定有序),分成两拨后,继续递归的使用上述方法,最终有序!
2、适用场景:基本无序的数据
3、代码实现:
    public static void quickSort(int data[], int start, int end) {
        int i, j;
        i = start;
        j = end;
        if((data == null) || (data.length == 0)) {
            return;
        }

        while(i < j) {
            // 以start下标的数据为key,从右向左依次扫描
            while(i < j && data[i] <= data[j]) {
                j--;
            }
            // 找出第一个比key小的,交换位置
            if(i < j) {
                int temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
            while(i < j && data[i] < data[j]) {
                // 左侧扫描(此时a[j]存着key的值)
                i++;
            }
            // 找出第一个比key大的,交换位置
            if(i < j) {
                int temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }
        // 递归调用,把key前面的完成排序
        if(i-start > 1) {
            quickSort(data, 0, i-1);
        }
        // 递归调用,把key后面的完成排序
        if(end-j > 1) {
            quickSort(data, j+1, end);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值