选择排序算法的实现(Java 版)

92 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 4 天,点击查看活动详情

选择排序算法的实现(Java 版)

原理

  • 将数组(链表)中的数据分为两个区间:已排序区间和未排序区间初始已排序区间没有元素

  • 选择排序每次会从未排序区间中找到最小(最大)的元素,将其放到已排序区间的末尾,保证已排序区间的数据一直有序。

  • 重复这个过程,直到未排序区间中元素只剩一个(元素为空),算法结束。

图示

在这里插入图片描述

代码

public class SelectionSort {
	
	/**
	 * 将 int[] 进行排序(整数排序)
	 * <p>
	 * 升序
	 *
	 * @param a int[]
	 *
	 * @return int[]
	 */
	public static int[] sortAsc(int[] a) {
		for(int i = 0; i < a.length; i++) {
			for(int j = i + 1; j < a.length; j++) {
				int tmp = i;
				if(a[tmp] > a[j]) {
					tmp = j;
				}
				// 将待排序区找到的最小的元素与待排序区第一个元素交换
				exchange(a, i, tmp);
			}
		}
		return a;
	}
	
	/**
	 * 将 int[] 进行排序(整数排序)
	 * <p>
	 * 降序
	 *
	 * @param a int[]
	 *
	 * @return int[]
	 */
	public static int[] sortDesc(int[] a) {
		for(int i = 0; i < a.length; i++) {
			for(int j = i + 1; j < a.length; j++) {
				int tmp = i;
				if(a[tmp] < a[j]) {
					tmp = j;
				}
				// 将待排序区找到的最小的元素与待排序区第一个元素交换
				exchange(a, i, tmp);
			}
		}
		return a;
	}
	
	/**
	 * 交换方法,交换 int 数组中的元素(基本数据类型)
	 *
	 * @param array 数组
	 * @param a     下标一
	 * @param b     下标二
	 */
	private static void exchange(int[] array, int a, int b) {
		int tmp = array[a];
		array[a] = array[b];
		array[b] = tmp;
	}
	
}

分析

  • 外层循环表示循环的次数内层循环用来找出最大(最小)的元素

  • 将目标元素放到已排序区后(待排序区第一个)即可,不需要额外操作。

  • 排序算法中,传入的数组,和排序后返回的数组 是同一个,返回值不是必备的。

  • 找 目标元素是最费时的。

  • 注意:选择排序和直接插入排序两者直接插入排序要略优于选择排序