Java排序算法之直接选择排序
Java排序算法之直接选择排序
基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上。第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
Java代码实现:
public class Xuanze { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ for(int j=i+1;j<s.length;j++){ if(s[i]>s[j]){ temp=s[i]; s[i]=s[j]; s[j]=temp; } } } for(int value:s) System.out.print(value); } }
上面排序方法存在效率问题。因为当我们发现当前数比被比较数小的时候我们就交换两个数,其实我们可以把当前数的位置保存下来,等到第一次比较完后在进行交换。
public class Xuanze { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ temp = i; for(int j=i+1;j<s.length;j++){ if(s[temp]>s[j]){ temp=j; //保存位置 } } if(temp!=i) exchang(s,i,temp); //进行交换 } for(int value:s) System.out.print(value); } private static void exchang(int[] s, int i, int j) { int temp = s[j]; s[j]=s[i]; s[i]=temp; } }
算法性能分析:
时间复杂度:假设有n个数据,数据交换的次数最多为n-1次,但程序的总体的比较次数较多。所以综合考虑有直接选择排序的时间复杂度为O(n2)
(n的平方)。所以当记录占用字节数较多时,通常比直接插入排序的执行速度快些。
空间复杂度:直接选择排序的空间复杂度很好,它只需要一个附加单元用于数据交换,所以其空间复杂度为O(1)。
稳定性:在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。