选择排序算法

本文介绍了一种基础排序算法——简单选择排序。详细解释了其工作原理、处理流程,并提供了PHP和C语言实现代码示例。分析了该算法的时间复杂度为O(N²),空间复杂度较小,适合初学者理解排序算法的基本概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单选择排序是一种排序算法。不稳定(稳定不稳定看相同的元素排序前后会不会发生变化,例如序列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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值