一、算法原理
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arrr[0]交换;第2趟,在待排序数据arr[2]~arr[n-1]中选出最小的数据,将它与r[1]交换;以此类推,第i趟在待排序数据arr[i]~arr[n-1]中选出最小的数据,将它与r[i-1]交换,直到全部排序完成。
二、算法举例
数组 int[] arr={5,2,8,4,9,1};
-------------------------------------------------------
第一趟排序: 原始数据:5 2 8 4 9 1
最小数据1,把1放在首位,也就是1和5互换位置,
排序结果:1 2 8 4 9 5
-------------------------------------------------------
第二趟排序:
第1以外的数据{2 8 4 9 5}进行比较,2最小,
排序结果:1 2 8 4 9 5
-------------------------------------------------------
第三趟排序:
除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换
排序结果:1 2 4 8 9 5
-------------------------------------------------------
第四趟排序:
除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换
排序结果:1 2 4 5 9 8
-------------------------------------------------------
第五趟排序:
除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换
排序结果:1 2 4 5 8 9
-------------------------------------------------------
外层循环次数为N-1;内层循环从i+1开始,到N-1结束。每一趟排序获得最小数的方法:for循环进行比较,定义一个变量temp,首先前两个数比较,把较小的数放在temp中,然后用temp再去跟剩下的数据比较,如果出现比temp小的数据,就用它代替temp中原有的数据。
三、算法时间复杂度
选择排序的时间复杂度:简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数永远都是N (N - 1) / 2。
所以,综上,简单排序的时间复杂度为 O(N2)。
四、算法实现
1 package recursion; 2 3 import java.util.Arrays; 4 5 /** 6 * @author zsh 7 * @company wlgzs 8 * @create 2019-02-17 8:47 9 * @Describe 选择排序算法实现 10 */ 11 public class SelectionSort { 12 13 /** 14 * 选择排序 15 * @param arr 待排序的数组 16 * @return 已排序的数组 17 */ 18 static int[] selectionSort(int[] arr){ 19 for (int i = 0; i < arr.length-1; i++) { 20 int k = i; 21 for (int j = i + 1; j < arr.length ; j++) { 22 if (arr[j] < arr[k]){ 23 //记录此时找到最小值的位置 24 k = j; 25 } 26 } 27 //内层循环结束,找到最小值后进行交换 28 if (i != k){ 29 int temp = arr[i]; 30 arr[i] = arr[k]; 31 arr[k] = temp; 32 } 33 } 34 return arr; 35 } 36 37 public static void main(String[] args) { 38 int[] arr = new int[]{5,2,8,4,9,1}; 39 System.out.println(Arrays.toString(selectionSort(arr))); 40 } 41 }