基本思想
简单选择排序是通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。
简单选择排序算法
void selectSort(int[] array) {
int length = array.length;
int min = 0;
for (int i = 0; i < length - 1; i++) {
// 将当前下标定义为最小值下标
min = i;
for (int j = i + 1; j < length; j++) {
if (array[min] > array[j]) {
min = j;
}
}
if (i != min) {
swap(array, i, min);
}
}
}
假定待排序序列为{9,1,5,8,3,7,4,6,2},对i从0循环到7:
- 当i=0时,array[i]=9,min=0,j=1到8,比较array[min]与array[j]的大小,当j=1时最小,所以min=1,最终交换array[1]与array[0]的值:PS:这里虽然比较了8次但只交换了数据一次
-
当i=1时,array[i]=9,min=1,j=2到8,比较array[min]与array[j]的大小,当j=8时最小,所以min=8,最终交换array[8]与array[1]的值:
- 之后的数据比较和交换完全雷同,最多经过8次交换即可完成排序工作。
优点:交换移动数据的次数非常少,节约了相应的时间
简单选择排序算法时间复杂度分析
对于比较而言,无论最好还是最坏的情况下,比较的次数都是一样多的:第i趟排序需要进行n-i次关键字的比较,所以共需要比较(n-1)+(n-2)+(n-3)+······+1次,就是n(n-1)/2次比较;对于交换而言,最好情况下交换0次,最坏情况下交换n-1次。
基于最终的时间复杂度是比较与交互次数的和,所以它的时间复杂度为O(n^2)
虽然简单选择排序与冒泡排序的时间复杂度均为O(n^2),但是简单选择排序在性能上还是略优于冒泡排序的。
网友评论