排序系列【比较排序系列之】直接选择排序
选择排序其算法思想是:逐个找出第i小的记录,并将其放到数组的第i个位置。选择排序的关键在于如何从剩余的未排序记录中找出最小或者最大的那个值,本篇我们则针对线性查找方法-直接选择排序进行一定的了解。
比如如下数组【45,34,78,12,34’,32,29,64】比较状况如下图:
执行过程如下:
当i=0时,j=i+1;smallest默认为A【i】;for(j=i+1;j<length;j++)找最小的smallest.
当j=1时,smallest=A【j】=A【1】=34;
当j=2时,smallest=A【j】=A【1】=34;
当j=3时,smallest=A【j】=A【3】=12;
当j=4时,smallest=A【j】=A【3】=12;
当j=5时,smallest=A【j】=A【3】=12;
当j=6时,smallest=A【j】=A【3】=12;
当j=7时,smallest=A【j】=A【3】=12;
交换A【0】和A【3】,i=0循环结束。
当i=1时,j=i+1=2;smallest默认为A【1】;for(j=i+1;j<length;j++)找最小的smallest.
当j=2时,smallest=A【j】=A【1】=34;
当j=3时,smallest=A【j】=A【1】=34;
当j=4时,smallest=A【j】=A【1】=34;
当j=5时,smallest=A【j】=A【1】=32;
当j=6时,smallest=A【j】=A【1】=29;
当j=7时,smallest=A【j】=A【1】=29;
交换A【1】和A【6】,i=1循环结束。
...依次循环下去。
代码如下:
public static void main(String[] args) {
int[] array = {45,34,78,12,34,32,29,64};
selectionSort(array);
System.out.println(Arrays.toString(array));
}
public static void selectionSort(int[] array) {
//定义一个最小值
int smallest;
//定义一个临时变量
int temp;
for (int i = 0; i < array.length - 1; i++) {
smallest = i;
//循环j,找剩余数值的最小值与a[i]兑换
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[smallest]) {
smallest = j;
}
}
temp = array[i];
array[i] = array[smallest];
array[smallest] = temp;
}
}
而时间复杂度,其实可以直观的看出来,i=1,比较n-1次;i=2,比较n-2次;…i=n-1,比较1次。
所以比较时间:T = (n-1))+ (n -2)+(n - 3)…. + 1; ===>> T = [n*(n-1) ] / 2;