前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法–选择排序。
选择排序
选择排序和插入排序很相似,也区分已排序区间和未排序区间,选择排序是每次从未排序区间找到最小的元素放到已排序区间的末尾。
如下图:
代码示例
go示例:
func SelectionSort(nums []int, n int) {
if n <= 1 {
return
}
for i := 0; i < n; i++ {
min := i
for j := i + 1; j < n; j++ {
if nums[j] < nums[min] {
min = j
}
}
if min != i {
nums[i], nums[min] = nums[min], nums[i]
}
}
}
PHP示例:
function SelectionSort($nums)
{
if(count($nums) <= 1 ){
return $nums;
}
for ($i = 0; $i < count($nums);$i++) {
$min = $i;
for ($j = $i + 1; $j < count($nums); $j++) {
if ($nums[$min] > $nums[$j]) {
$min = $j;
}
}
if ($min != $i) {
$temp = $nums[$i];
$nums[$i] = $nums[$min];
$nums[$min] = $temp;
}
}
return $nums;
}
JS示例:
const selectionSort = (arr) => {
if (arr.length <= 1) return
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
const temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
console.log(arr)
}
性能分析
最后我们看下插入排序的性能和稳定性:
-
时间复杂度:嵌套了两个循环,O(n2)
-
空间复杂度:不需要额外的存储空间,是原地排序算法
-
算法稳定性:每次都要找未排序区间的最小值并和前面的元素交换位置,涉及到位置交换,是不稳定的排序算法
介绍完了三种排序算法,时间复杂度都是O(n2),也都是原地排序,选择排序是不稳定的排序算法。插入排序和冒泡排序相比,插入排序需要一条语句,冒泡排序需要三个赋值语句,所以插入排序要优于冒泡排序。
但是在数据量大的时候这三个排序算法都不是很理想,接下来我会再分享两种时间复杂度为O(nlogn)的排序算法。