算法__数组排序_冒泡排序&直接选择排序&快速排序

文章目录

本篇主要讲解数组排序相关的三种算法,冒泡排序,直接排序和快速排序。

冒泡排序

算法说明

在数组中依次比较相邻的两个元素,当满足左侧大于右侧时(升序排序),则两个位置的元素互换。如此重复,最终即可完成数组的排序。

代码实现

java 复制代码
public static void bubbleSort(int[] array){
// 循环轮数比数组大小小1轮
	for(int i = 1; i < array.length; i++){
	// 循环1轮后,最大的元素,已经排到数组后面,不用再参与比较
		for(int j = 0; j < array.length - i; j++){
			if(array[j] > array[j+1]){
				int temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}
}

直接选择排序

算法说明

依次找出数组中最小值的索引,并和数组左侧的元素进行位置交换。

这样从整体上就是数组的左侧部分是按照由小到大依次排列的有序数组。

代码实现

java 复制代码
public static void selectSort(int[] array){
	for(int i = 0; i < array.length - 1; i++){
	// 记录比较的元素和索引
		int min = array[i];
		int minIndex = i;
		for(int j = i + 1; j < array.length; j++){
			if(array[j] < min){
			// 记录最小值的索引和值
				minIndex = j;
				min = array[j];
			}
		}
		// 将最小值与前面的元素交换
		int temp = array[minIndex];
		array[minIndex] = array[i];
		array[i] = temp;
	}
}

快速排序

算法说明

选择一个基准比较值,然后依据这个基准值,将数组分隔为两个部分,左侧的部分为所有小于基准的值,右侧部分为所有大于基准的值。

代码实现

java 复制代码
/**
     * 快速排序法,排序数组
     * @author Ethan
     * @description
     * @param array
     */
    public static void quickSort(int[] array){
        subSort(array,0,array.length - 1);
    }

    /**
     * 快速排序法的核心算法
     * @author Ethan
     * @description
     * @param array 被排序的数组
     * @param start 起始索引
     * @param end 结束索引
     */
    public static void subSort(int[] array, int start, int end){
        if(start < end){
//            选取数组最左边的元素作为判断基础
            int base = array[start];
            int left = start;
            int right = end + 1;
            while(true){
//                从左向右遍历遇到大于基数的索引停止,left指向大于基数的索引
                while(left < end && array[++left] <= base)
                    ;
//                从右向左遍历找到小于基数的索引停止,right指向小于基数的索引
                while(right > start && array[--right] >= base)
                    ;
//                当大于基数的索引在小于基数的索引前时,进行交换,让小于基数的值都在左边,大于基数的值都在右边
                if(left < right) {
                    swap(array,left,right);
                }else{
                    break;
                }
            }
//            将基数和小于基数的最右边的元素位置对换
            swap(array,start,right);
//            递归排序分割后的数组
            subSort(array,start,right-1);
            subSort(array,right + 1,end);
        }
    }

    /**
     * 交换数组中两个索引处的数值
     * @author Ethan
     * @description
     * @param array
     * @param left
     * @param right
     */
    public static void swap(int[] array, int left, int right){
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }
相关推荐
a5876929 分钟前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
千里码aicood40 分钟前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan1644 分钟前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………1 小时前
差分数组(Difference Array)
java·数据结构·算法
BillKu1 小时前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
hansang_IR1 小时前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
乐迪信息1 小时前
乐迪信息:AI摄像机在智慧煤矿人员安全与行为识别中的技术应用
大数据·人工智能·算法·安全·视觉检测
多恩Stone2 小时前
【3DV 进阶-2】Hunyuan3D2.1 训练代码详细理解下-数据读取流程
人工智能·python·算法·3d·aigc
刘婉晴2 小时前
【Java】NIO 简单介绍
java·nio
渣哥2 小时前
聊聊我和 ArrayList、LinkedList、Vector 的“一地鸡毛”
java