算法详解之选择排序算法

算法思想

选择排序 是一种简单直观的排序算法,它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

时间复杂度

选择排序 需要从头到尾遍历所有元素来进行对比,因此其时间复杂度为:
O(n2) O(n ^ 2)

适用场景

由选择排序的时间复杂度可知,该排序算法适用于数据规模越小越好

对比冒泡排序

选择排序冒泡排序 的时间复杂度都是 O(n2)O(n ^ 2) ,那么它们之间的区别是什么呢?其实两者的算法思想很相似,都是对比并交换位置,但是前者是每轮找到最小值然后再与第一个元素进行交换位置,而后者是两两对比并立即交换位置,也就是说同一数据集的情况下,选择排序要比冒泡排序减少了交换次数。

算法步骤

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章