我一定要掌握一些基本的排序算法,对,没错,说到做到,今天学习了选择排序算法。
一、算法描述
首先找到数组中的最小的那个元素,把它和数组的第一个元素位置交换(如果第一个元素是最小元素那么它就和自己交换)。在剩下的元素中找到最小的元素,将它和第二个元素交换位置,如此重复,正道将整个元素排序完成,这种叫做选择排序,就是不断地选择剩下元素中的最小者。
举个栗子:
原数组:5, 2 , 9 , 6 , 3(第一趟选择最小数进行交换)
第一趟:2, 5 , 9 , 6 , 3
第二趟:2, 3 , 9 , 6 , 5
第三趟:2, 3 , 5 , 6 , 9
第四趟:2, 3 , 5 , 6 , 9
二、算法复杂度分析
平均时间复杂度:O(n^2)
空间复杂度:O(1)(用于交换和记录索引)
稳定性:不稳定(如[5 , 5 , 3]第一趟将5和3交换,倒置第一个5挪到第二个5后面)
三、算法实现(NO BB Show Your Code)
1 package cn.zpoor.Test; 2 /** 3 * @author 薛定谔的猫 4 * 选择排序实现*/ 5 public class Selection { 6 public static void main(String[] args) { 7 int[] arr = {5,2,9,6,3}; 8 System.out.println("选择排序之前:"); 9 for(int num:arr) { 10 System.out.print(num+ " "); 11 } 12 13 //选择排序的优化 14 for(int i = 0;i<arr.length-1;i++) { 15 int k = i;//记录值 16 for(int j = k+1;j<arr.length;j++) {//选最小的索引值 17 if (arr[j]<arr[k]) { 18 k = j;//记录找到的最小值的索引值 19 } 20 } 21 //内层循环结束后,找到本轮最小的数之后,进行交换 22 if (i!=k) { 23 //交换位置 24 int temp = arr[i]; 25 arr[i] = arr[k]; 26 arr[k] = temp; 27 } 28 } 29 System.out.println(); 30 System.out.println("选择排序之后:"); 31 for(int num:arr) { 32 System.out.print(num + " "); 33 } 34 } 35 } 36 /* 37 选择排序之前: 38 5 2 9 6 3 39 选择排序之后: 40 2 3 5 6 9 */
睡觉。