简单选择排序是一种排序算法。不稳定(稳定不稳定看相同的元素排序前后会不会发生变化,例如序列5*、8、5、2、9 使用选择排序后5*排在5的后面)
选择排序思想:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录列末尾,直到全部排序结束。
简单排序处理流程:
(1)待排序的记录中选出关键字最小的记录
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换。
(3)从余下的N-1个元素中,找出关键字最小的元素,重复(1)(2),直到排序结束。
如图所示,每趟排序将当前第i小的元素放在位置i上。
动画演示:
算法分析:
时间复杂度
简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数总是N (N - 1) / 2。
而移动次数与序列的初始排序有关。当序列正序时,移动次数最少,为 0.
当序列反序时,移动次数最多,为3N (N - 1) / 2。
所以,综合以上,简单排序的时间复杂度为 O(N2)。
空间复杂度
简单选择排序需要占用 1 个临时空间,在交换数值时使用。兑现代码:
<?php
function selection_sort($arr){
//外循环遍历获得最小值得次数,
$len = count($arr);
for ($i=0; $i < $len-1; $i++) {
//内循环查找最小值的位置,
$index = $i;//保存当前位置的索引
for ($j=$i+1; $j < $len; $j++) {
if ($arr[$index]>$arr[$j]) {
$index=$j;//保存第i小值的索引
}
}
//将一趟找到的第i小的数值和第i个数交换位置
$temp = $arr[$index];
$arr[$index]=$arr[$i];
$arr[$i]=$temp;
//var_dump($arr);
}
return $arr;
}
$list= array('9','1','2','5','7','4','8','6','3','5');
$list = selection_sort($list);
var_dump($list);
截图:
C语言版本
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
//选择排序 每轮找出最小的一次和最前面的交换
//第一轮 找出最小的 和0号位置的交换
//第二轮 从剩下的找出最下的 和1号位置交换
//第三轮 从剩下的找出最小的 和2号位置交换
void select_sort(int array[],int len)
{
int i,j,index,tmp;
for (i = 0;i<len-1;i++)
{
index = i;
for (j = i+1 ;j<len;j++)
{
if (array[index]>array[j])
{
index = j;//记录最小的下标
}
}
tmp = array[index];
array[index] = array[i];
array[i] = tmp;
}
}
void printArray(int array[],int len)
{
int i = 0;
for (i=0;i<len;i++)
{
printf("%d ",array[i]);
}
}
int main()
{
int array[] = {38,49,65,76,97,27};
//insert_sort(array,6);
//printArray(array,6);
select_sort(array,6);
printArray(array,6);
system("pause");
return 0;
}