勿忘初心,奋起直追
在网上经常看到这种伪选择排序算法,包括自己在第一次编写选择排序时也编写了如下的效率不高的代码:
publi class FalseSort {
public FalseSort(){
int a[]={1,54,6,3,78,34,12,45};
int temp=0;
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
}
}
在代码第二层for
循环中做了一次交换,两层for
循环后可能要做n(n-1)/2
次交换.
但在实际的选择排序中,只做n次交换就可以了.真正的选择排序是每次记录最小元素的下标,直到最后才进行交换
example
// 选择排序
public void selectSort(){
int min = 0;
long tmp = 0L;
for(int i = 0; i < elems -1; i++){
min = i;
for(int j = i + 1; j < elems; j++) {
if(arr[j] < arr[min]) {
min = j;
}
}
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}