【基础算法】排序算法

冒泡排序

数组元素 两两对比,让最大的元素升到数组最后位置,或最小值降到数组最后位置。

【Java版】代码实现

public class MyTest {
    public static void main(String[] args) {
        int[] array = new int[]{1, 2, 3, 4, 5, 6, 7};
        bubbleSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
    public static void bubbleSort(int[] nums) {
        for (int i = nums.length - 1; i > 0; i--) { // 一共跑多少趟
            for (int j = 0; j < i; j++) { // 每趟都从下标0开始往后遍历
                if (nums[j] < nums[j + 1]) {
                    swap(nums, j, j + 1);
                }
            }
        }
    }
    public static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

注意:

  1. 外层循序小技巧:i = nums.length - 1;每次从头开始两两对比,直到 i 位置停止

选择排序

每次从无序子数组中挑选一个最小的元素,与无序子数组最左侧进行交换

【Java版】代码实现

public class MyTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 4, 3, 2, 1};
        selectionSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
    public static void selectionSort(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            int min_index = i;
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[min_index] > nums[j]) {
                    min_index = j;
                }
            }
            swap(nums, i, min_index);
        }
    }
    public static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

注意:


插入排序

打扑克时捋牌的过程,从无序牌中按序抽出一张,插入到有序牌中,从有序牌的末尾开始向前遍历找到合适的位置,插入

【Java版】代码实现

public class MyTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 4, 3, 2, 1};
        insertionSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
    public static void insertionSort(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            for (int j = i; j > 0; j--) {
                if (nums[j] < nums[j - 1]) {
                    swap(nums, j, j - 1);
                }
            }
        }
    }
    public static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

注意:


插入排序

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

【Java版】代码实现

public class MyTest {
    public static void main(String[] args) {
        int[] array = new int[]{5, 4, 3, 2, 1};
        insertionSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    public static void swap(int[] nums, int i, int j) {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}

注意:


引用
排序算法时间复杂度、空间复杂度、稳定性比较
十大排序算法合集超详细–原理、描述、动画、源码、复杂度、稳定性分析
1.0 十大经典排序算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值