算法思想
选择排序 是一种简单直观的排序算法,它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
时间复杂度
选择排序 需要从头到尾遍历所有元素来进行对比,因此其时间复杂度为:
适用场景
由选择排序的时间复杂度可知,该排序算法适用于数据规模越小越好。
对比冒泡排序
选择排序 和 冒泡排序 的时间复杂度都是 ,那么它们之间的区别是什么呢?其实两者的算法思想很相似,都是对比并交换位置,但是前者是每轮找到最小值然后再与第一个元素进行交换位置,而后者是两两对比并立即交换位置,也就是说同一数据集的情况下,选择排序要比冒泡排序减少了交换次数。
算法步骤
1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
2、再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;
3、重复第二步,直到所有元素均排序完毕。
动图演示
代码实现
JavaScript实现
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
//需要经过N-1轮对比
for (var i = 0; i < len - 1; i++) {
minIndex = i; //最小值的索引
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; //找到最小值并更新其索引
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
Python实现
def selectionSort(arr):
for i in range(len(arr)):
min_index = i # 最小值索引
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
if i != min_index:
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
Java实现
public int[] selectionSort(int[] sourceArray) {
//复制源数组
int[] arr = Arrays.copyOf(sourceArray,sourceArray.length);
//总共需要经过N-1轮比较
for(int i = 0; i < arr.length - 1; i++) {
//最小值的索引
int minIndex = i;
//每轮循环需要 N-i次对比
for (int j = i + 1; j < arr.length; j++) {
//找到本轮的最小值,并更新其索引
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
//找到最小值和i位置所在的值进行交换
if (i != minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}