冒泡排序、选择排序、插入排序,三种简单排序算法的区别?

1、冒泡排序

冒泡排序是从下标 1 遍历到 n,每当遇到大于下一个的,就和上一个交换位置,这样最大的就移动到了 n 的位置,然后从头再从 1 遍历到 n-1,把第二大的移动到 n-1 的位置,依此类推,每次从剩下的里面挑出最大的一个放在末尾。它的特点是每次遍历过程中都会不断的交换位置,即为冒泡排序,是一种稳定排序。

java 复制代码
package com.fdw.algorithm.sort;

import java.util.Arrays;

/**
 * @program: RedisDemo
 * @description: 冒泡排序
 * @author: fudingwei
 * @create: 2024-05-30 13:58
 **/
public class BublingSort {

    public static void main(String[] args) {
        int[] array = new int[]{6,5,72,1,4,5,12,8,3,2,7};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void sort(int[] array){
        for (int i = 0; i < array.length; i++) {
            boolean flag = true;
            //关键是j < array.length-i-1
            for (int j = 0; j < array.length-i-1; j++) {
                //冒泡排序的过程中不停的在交换
                if(array[j]>array[j+1]){
                    swap(array,j,j+1);
                    flag = false;
                }
            }
            //没有进行交换,说明已经有序
            if(flag){
                break;
            }
        }
    }

    public static void swap(int[] array,int left,int right){
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }
}

2、选择排序

选择排序是是从下标 1 遍历到 n,找出最小数的下标,然后将最小数和下标 1 交换位置,然后再从下标 2 遍历到 n,找出第二小的数,将其和下标 2 交换位置,依此类推,每次从剩下的里面挑出最小的一个放在前面。它的特点是每次遍历过程中只会交换一次位置,即为选择排序,是一种不稳定排序。

java 复制代码
package com.fdw.algorithm.sort;

import java.util.Arrays;

/**
 * @program: RedisDemo
 * @description: 选择排序
 * @author: fudingwei
 * @create: 2024-05-30 14:24
 **/
public class SelectSort {

    public static void main(String[] args) {
        int[] array = new int[]{6, 5, 72, 1, 4, 5, 12, 8, 3, 2, 7};
        sort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void sort(int[] array) {

        for (int i = 0; i < array.length; i++) {
            int min = i;
            //每次选出最小的,存下标
            for (int j = i + 1; j < array.length; j++) {
                if (array[j] < array[min]) {
                    min = j;
                }
            }
            //把最小的放第一位
            if (min != i) {
                swap(array, i, min);
            }
        }
    }

    public static void swap(int[] array, int left, int right) {
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }
}

3、插入排序

插入排序是从第二位开始遍历,遍历时当这一位数小于前一位时,就会和前面的进行交换位置,如果交换完后该数仍然小于前一位,会继续交换,一直到该数不小于前一位为止,它的特点是每次遍历前都能保证前面的数据已经是递增的状态,将数据插入到已有顺序中它应该在的位置,即为插入排序,是一种稳定排序。

java 复制代码
package com.fdw.algorithm.sort;

import java.util.Arrays;

/**
 * @program: RedisDemo
 * @description: 插入排序
 * @author: fudingwei
 * @create: 2024-05-30 11:54
 **/
public class InsertSort1 {
    public static void main(String[] args) {
        int[] data = {1,1,2,8,4,2,1,6,4,8,6,9,2,1};
        sort(data);
        System.out.println(Arrays.toString(data));
    }

    public static void sort(int[] array){
        for (int i = 1; i < array.length; i++) {
            //遍历i前的值 大于array[i]就后移,一边移动一边排序,保证了temp前的数据一定是递增的
            for (int j = i-1; j >=0; j--) {
                if(array[j]>array[j+1]){
                    //交换
                    swap(j+1,j,array);
                }else {
                    break;
                }
            }
        }
    }


    public static void swap(int l,int r,int[] array){
        int temp = array[l];
        array[l] = array[r];
        array[r] = temp;
    }
}

总结

三种排序算法都是使用了两个for循环来遍历,时间复杂度都是O(n的平方),选择排序是不稳定的,其他两种是稳定的,三种算法都涉及到位置的交换,选择排序交换的次数最少。

相关推荐
东方佑35 分钟前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落1 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆1 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
Dfreedom.1 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
CoderCodingNo2 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www2 小时前
算法学习入门---双指针(C++)
c++·算法
Shilong Wang3 小时前
MLE, MAP, Full Bayes
人工智能·算法·机器学习
Theodore_10223 小时前
机器学习(6)特征工程与多项式回归
深度学习·算法·机器学习·数据分析·多项式回归
知花实央l3 小时前
【算法与数据结构】拓扑排序实战(栈+邻接表+环判断,附可运行代码)
数据结构·算法
lingling0093 小时前
机械臂动作捕捉系统选型指南:从需求到方案,NOKOV 度量光学动捕成优选
人工智能·算法