经典排序算法 - 选择排序
概述
含义:直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。
特点:以从小到大排序为例:N个元素,每一趟比较找出最小的那个元素,放在头部;经过N-1趟比较,排序就出来了。
相当于每次从无序列表里找出一个最小数,放到左边;然后剩下的元素继续找出最小的,放在左边;直到排序完成。
题目:给出无需数组 [4,3,1,2],要求按照从小到大排序。
输出样例:
1
2
3
4
排序过程:
原数组:
4,3,1,2
- 第1趟:
3,4,1,2
1,4,3,2
1,4,3,2
- 第2趟:
首元素已排好序,固定住。
1,3,4,2
1,2,4,3
- 第3趟:
第2个元素已排好序,固定住。
1,2,3,4
实现:
/**
* 选择排序
* 时间O(N^2),最好O(N^2);空间O(1)
*
* 1、每趟都从待排序数字里找出最小的数字,循环找的过程中不交换;这趟查找结束的时候如果发现有更小的则进行交换一次。
* 2、第一趟开始的时候所有数字都是待排序。
* 3、每趟里的每次都先将待排序的第一个数当做最小的。
* @param $arr
*/
function SelectionSort($arr)
{
$len = count($arr);
//从第一个数开始,只需要N-1趟
for ($i = 0; $i < $len - 1; $i ++) {
$min = $i; //假设第一个数是最小的
//从第2个数开始与第一个数比较
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$min]) { //如果当前数小于min所在的数
$min = $j; //发现了当前数是更小的数, min更新为当前数
}
}
//比较min是否发生了变化,如果是则说明发现了更小的数,交换两数
if ($min != $i) {
$tmp = $arr[$i];
$arr[$i] = $arr[$min];
$arr[$min] = $tmp;
}
}
return $arr;
}
参考:
经典排序算法 - 选择排序Selection sort - kkun - 博客园
http://www.cnblogs.com/kkun/archive/2011/11/23/2260281.html
(本文完)
本文优先在公众号"飞鸿影的博客(fhyblog)"发布,欢迎关注公众号及时获取最新文章推送!
本文优先在公众号"飞鸿影的博客(fhyblog)"发布,欢迎关注公众号及时获取最新文章推送!

作者:飞鸿影
出处:http://52fhy.cnblogs.com/
版权申明:没有标明转载或特殊申明均为作者原创。本文采用以下协议进行授权,自由转载 - 非商用 - 非衍生 - 保持署名 | Creative Commons BY-NC-ND 3.0,转载请注明作者及出处。
