引理:
选择排序属于内部排序的一种,从预排序的序列中,按照指定的规则选出某一元素(最大或者最小)到最前面,直到最后一个元素为止。
思想:
和冒泡排序大体差不多,冒泡排序是两两比较,选择是针对于整体的,从第二个元素开始,每次选择一个最大或者最小的元素到最前面,直至最后一个元素。
思路分析图:
代码实现:
public static void main(String[] args) {
int [] num= {10,5,20,30,15,50,40,60};
for(int i=0;i<num.length-1;i++){//比较的轮数
for(int j=i+1;j<num.length;j++) {
if(num[j]<num[i]) {
int temp=num[j];
num[j]=num[i];
num[i]=temp;
}
}
}
for(int i=0;i<num.length;i++) {
System.out.print(num[i]+" ");
}
}
时间复杂度分析:
此排序的最大特点就是交换移动数据次数相当少,节约了相应的时间
无论最好还是最坏情况,其比较次数都是一样多的,共需要比较 (n-1)+ (n-2)+…+ 2 + 1 = n * (n-1)/2次;
而对交换次数而言,当最好的时候,交换0次,最差时,交换n-1次;
基于最终的排序时间是比较和交换次数总和。
因此,总的时间复杂度依然为O(n^2),但性能优于冒泡排序。
稳定性:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到所有待排序的数据元素排完。所以选择排序是不稳定的排序方法。