Java之数组应用-选择排序-插入排序

已经完全掌握了冒泡排序和二分查找的同学,可以自己尝试学习选择、插入排序。不要求今天全部掌握,最近2-3天掌握即可!

1 选择排序

选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾,最终完成排序。

选择排序算法描述:

  1. 初始状态:无序区间为 Arr[0.1...n],有序区间为空;
  2. 第i==1趟排序开始,从无序区中选出最小的元素Arr[k],将它与无序区的第1个元素交换,从而得到有序区间Arr[0...i-1],无序区间Arr[i...n];
  3. 继续后面第i趟排序(i=2,3...n-1),重复上面第二步过程;
  4. 第n-1趟排序结束,数组排序完成。

选择排序过程如下图:

源码实现:

java 复制代码
import java.util.Arrays;

public class Test07_SelectSort {
	public static void main(String[] args) {
        //准备一个int数组
        int[] array = {5, 2, 6, 5, 9, 0, 3};
        
        System.out.println("排序前: "+ Arrays.toString(array));
        
        //插入排序
        selectionSort(array);
        
        //输出排序结果
        System.out.println("排序后: "+ Arrays.toString(array));
    }
    
    public static void selectionSort(int[] arr) {
		int len = arr.length;
		if(len <= 1)
			return;
		
		//外层循环控制总体排序次数
		for(int i = 0; i < len-1; i++) {			
			int minIndex = i;
			//内层循环找到当前无序列表中最小下标
			for(int j = i + 1; j < len; j++) {
				if(arr[minIndex] > arr[j]) {
					minIndex = j;
				}
			}
			
			//将无需列表中最小值添加到 有序列表最后位置
			if(minIndex != i) {
				arr[minIndex] = arr[minIndex] ^ arr[i];
				arr[i] = arr[minIndex] ^ arr[i];
				arr[minIndex] = arr[minIndex] ^ arr[i];
			}
			
			//System.out.println(Arrays.toString(arr));
		}
	}
}

2 插入排序

插入排序(Insertion Sort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。

插入排序算法描述:

  1. 将数组分成两部分,已排序、未排序区间,初始情况下,已排序区间只有一个元素,即数组第一个元素;
  2. 取未排序区间中第一个元素,插入到已排序区间中合适的位置,这样子就得到了一个更大的已排序区间;
  3. 重复这个过程,直到未排序区间中元素为空,算法结束。

插入排序过程见下图:

源码实现:

java 复制代码
import java.util.Arrays;

public class Test07_InsertSort { 
    public static void main(String[] args) {
        //准备一个int数组
        int[] array = {5, 2, 6, 5, 9, 0, 3};
        
        System.out.println("排序前: "+ Arrays.toString(array));
        
        //插入排序
        insertionSort(array);
        
        //输出排序结果
        System.out.println("排序后: "+ Arrays.toString(array));
    }
    
	public static void insertionSort(int[] arr) {
        int len = arr.length;
        if(len <= 1) {
        	return;
        }
        
        //外层循环控制 总体循环次数
        for(int i = 1; i < len; i++) {
        	//内层循环做的事情:将无序列表中第一个元素插入到有序列表中合适位置
        	int value = arr[i];
        	//获取有序列表中最后一个元素下标
        	int j = i - 1;
        	for(; j >= 0; j--) {
        		if(value < arr[j]) {
        			arr[j+1] = arr[j];
        		}else {
        			break;
        		}
        	}
        	
        	//将需要插入的元素 放置到合适位置
        	arr[j+1] = value;
        	
        	//一次排序完成后,输出 方便 观察
        	System.out.println(Arrays.toString(arr));
        }
    }
}
相关推荐
参.商.几秒前
【Day47】912. 排序数组【6 种排序】
leetcode·golang·排序算法
twc829几秒前
不可言说的知识:AI时代软件工程的核心传递问题
java·人工智能·大模型·软件工程·知识工程
We་ct2 分钟前
LeetCode 33. 搜索旋转排序数组:O(log n)二分查找
前端·算法·leetcode·typescript·个人开发·二分·数组
智驱力人工智能3 分钟前
一盔一带AI抓拍系统能否破解非机动车执法取证难 骑行未戴头盔检测 电动车未戴头盔智能监测 摩托车头盔佩戴AI识别系统 边缘计算实时处理
人工智能·算法·yolo·目标检测·边缘计算
重生之我是Java开发战士6 分钟前
【优选算法】优先级队列:最后一块石头的重量,数据流中的第K大元素,前K个高频单词,数据流中的中位数
数据结构·算法·leetcode
华仔啊7 分钟前
前端不懂 Java?后端怕 CSS?这套AI全栈方案专治各种偏科
java·前端·后端
智算菩萨9 分钟前
音频处理基础理论:从物理声波到数字信号完整知识体系
算法·机器学习·电脑·音视频
小高求学之路1 小时前
计算机视觉、YOLO算法模型训练、无人机监测人员密集自动识别
算法·yolo·计算机视觉
散峰而望1 小时前
【基础算法】剪枝与记忆化搜索:算法优化的双刃剑,效率倍增的实战指南
算法·机器学习·剪枝
m0_748873551 小时前
C++与Rust交互编程
开发语言·c++·算法