选择排序:
基本思想: 每一趟从待排序的数据元素中选择一个最值作为首元素
$arr = array(3, 1, 4, 7);
function selection_sort($arr)
{
// 外层循环的轮数
for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
{
for ($j = $i + 1; $j < $len; $j++)
{
// 伪代码: 交换两个位置的元素
swap($i, $j);
}
}
return $arr;
}
选择排序改进:
$arr = array(3, 1, 4, 7);
function advanced_selection_sort($arr)
{
for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
{
$min = $i; // $min 中存放的将是最值(本例是最小值)下标
for ($j = $i + 1; $j < $len; $j++)
{
if ($arr[$j] < $arr[$min])
{
$min = $j;
}
}
// 进行交换,如果 $min 发生变化,则交换
if($min != $i)
{
// 伪代码实现
swap($arr[$min], $arr[$i]);
}
}
return $arr;
}
冒泡排序:
基本思想: 对相邻的元素进行两两比较,根据需要交换,每一趟将一个最值"浮动"到顶端,最终完成排序。
$arr = array(3, 1, 4, 7);
function bubble_sor($arr)
{
for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
{
$flag = true; // 如果有一轮排序中,没有发生交换,则元素已经是正确的顺序,排序结束。
for ($j = 0; $j < $len -1 - i; $j++)
{
// 伪代码实现
swap($arr[$j], $arr[$j + 1]);
flag = false;
}
if (flag)
{
break;
}
}
}
插入排序:
假定手上的牌是已经排好序的,将每次取到的牌插入合适的位置。只是在程序中,需要为每次待插入的牌挪出一个位置
动画演示:
图片来源:
https://www.cnblogs.com/onepixel/articles/7674659.html
#define LEN 5
int a[LEN] = {1, 5, 4, 2, 3};
void insertion_sort(void)
{
int i, j, key;
// 从 1 到 LEN 每次取一张牌
for(j = 1; j < LEN; j++)
{
printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
key = a[j];
i = j - 1;
// 将已有的牌排好序
while(i >= 0 && a[i] > key)
{
a[i + 1] = a[i];
i--;
}
// 将取到牌插入
a[i + 1] = key;
}
printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
}
int main(void)
{
insertion_sort();
return 0;
}