标签:
简介
白哥解释:选择排序过程:第 n 轮时是将第 n 个数和后面每一个数进行比较,如果第 m 个数比第 n 个数小,就记录第 m 个数的位置,然后继续拿第 m 个数和后面每一个数进行比较,直到结尾;一共排了 a.length 轮,第 n 轮排序的结果是把最 n 小数的和第 n 个数交换位置。第 n 轮比较次数为 a.length-n,每一轮交换次数都是 0或1 ,共排序 m=a.length 轮所以共比较 (m)+(m-1)+(m-2)+……+2+1=m(m-1)/2 次,共交换 m 次(最多),总的时间复杂度为O(m^2)+O(m)=O(m^2)过程:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小,则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较,如果后面的元素比他要小,则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。时间复杂度:选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
示例
public static void select(int[] a) {System.out.println(Arrays.toString(a));int minIndex = 0;for (int i = 0; i < a.length; i++) {minIndex = i;//无序区的最小数据数组下标for (int j = i + 1; j < a.length; j++) {//在无序区中找到最小数据并保存其下标if ((a[j] < a[minIndex])) minIndex = j;}if (minIndex != i) {//如果不是无序区的最小值位置不是默认的第一个数据,则交换之int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}System.out.println(Arrays.toString(a) + " minIndex=" + minIndex);}}[8, 5, 2, 7][2, 5, 8, 7] minIndex=2[2, 5, 8, 7] minIndex=1[2, 5, 7, 8] minIndex=3[2, 5, 7, 8] minIndex=3
标签:
原文地址:http://www.cnblogs.com/baiqiantao/p/5452273.html