算法——选择排序

package test;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/*算法思想:初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。*/
public class Algorithm {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<Integer> array = new ArrayList<Integer>();
		array = getRandomList(10, 100);
		selectSort(array);
		System.out.println(array.toString());

	}

	/**
	 * 选择排序
	 * 
	 * @Title selectSort
	 * @param array需要排序的数据
	 * @Author: YHM
	 */
	static void selectSort(List<Integer> array) {
		for (int i = 0; i < array.size() - 1; i++) {// i为已排序序列的末尾
			int min = i;
			for (int j = i + 1; j < array.size(); j++) {// 未排序序列
				if (array.get(j) < array.get(min)) {// 找出未排序序列中的最小值
					min = j;
				}
			}
			if (min != i) {
				swap(array, min, i);// 放到已排序序列的末尾,该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法
			}
		}
	}

	/**
	 * 交换数组中两个数的位置
	 * 
	 * @Title swap
	 * @param array数组
	 * @param i索引
	 * @param j索引
	 * @Author: YHM
	 */
	static void swap(List<Integer> array, int i, int j) {
		array.set(i, array.get(i) + array.get(j));
		array.set(j, array.get(i) - array.get(j));
		array.set(i, array.get(i) - array.get(j));
	}

	/**
	 * 不带种子,每次的随机数不同
	 * 
	 * @Title getRandomList
	 * @param count产生的随机数的个数
	 * @param max产生的随机数的范围
	 * @return 随机数列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomList(int count, int max) {
		ArrayList<Integer> list = new ArrayList<>();
		Random rand = new Random();
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

	/**
	 * 带种子,每次的随机数相同
	 * 
	 * @Title getRandomList
	 * @param count产生的随机数的个数
	 * @param max产生的随机数的范围
	 * @return 随机数列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomList(int count, int max, int seed) {
		ArrayList<Integer> list = new ArrayList<>();
		Random rand = new Random(seed);
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

	/**
	 * 生成完全不重复的随机数
	 * 
	 * @Title getRandomList
	 * @param count产生的随机数的个数
	 * @param max产生的随机数的范围
	 * @return 随机数列表
	 * @Author: YHM
	 */
	static ArrayList<Integer> getRandomListNoRepeat(int count, int max) {
		ArrayList<Integer> list = new ArrayList<>();
		SecureRandom rand = new SecureRandom();
		for (int i = 0; i < count; i++) {
			int temp = rand.nextInt(max);
			list.add(temp);
		}

		return list;
	}

}

点赞