算法思路,第一次找最小的与首位i交换,后面的与i++交换
以由小到大排序为例,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
第一轮∶找到最小值23,跟第1个位置29交换,得到有序集合{23}。
第二轮∶从无序集合中找到最小值27,跟第2个位置38交换,得到有序集合{23,27].
第三轮∶从无序集合中找到最小值29,跟第3个位置65交换,得到有序集合{23,27,29]。
第四轮:从无序集合中找到最小值29,跟第4个位置87交换,得到有序集合{23,27,29,29]。
第五轮︰从无序集合中找到最小值38,跟第5个位置78交换,得到有序集合{23,27,29,29,38}。
第六轮︰从无序集合中找到最小值65÷不需要交换,得到有序集合{23,27,29,29,38,65}。
第七轮∶从无序集合中找到最小值78,不需要交换,得到有序集合{23,27,29,29,38,65,78]。
代码实现
public class SelectionSort{public static void main(String[] args){int[ ] arr = {29,38,65,87,78,23,27,29};selectionsort( arr);System.out.println(Arrays.toString(arr)) ;}public static void swap(int[] arr,int i,int j){int temp = arr[i];arr[i]=arr[j];arr[j]=temp;}public static void selectionSort(int[] arr){for(int i = 0;i<arr.length-1;i++){int min_index = i;for(int j = i+1;j<arr.length;j++){if(arr[j]<arr[min_index]){min_index = j;}}//用最小值替换i的位置swap(arr, i, min_index)}}}
算法稳定性
如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的;选择排序有不稳定性的算法。例如序列“5(1),8,5(2),2,9”,5(1)会和2交换,破坏稳定性。
时间复杂度∶
1:n-1
2:n-2
3:n-3
4:n-4
……
n-1:1
比较次数=(n-1+1)(n-1)/2=(n^2-n)/2
时间复杂度=o(n2)

