选择排序
思想
- 一开始的数据都看作待排序数据。
-
找到数组中最小的那个元素
-
将最小的这个元素和数组中第一个元素交换位置
-
在剩下的元素中找到最小的的元素,与数组第二个元素交换位置
- 从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)、(3)步,直到排序结束。
因此我们可以发现,简单选择排序也是通过两层循环实现。
- 第一层循环:依次遍历序列当中的每一个元素
- 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。
代码实现
插入排序
思想
把一个数组分为前后两种元素,前面的为已经排好序的元素,后面的为没有排序的元素。每次排序都把后面的元素一次和前面排好序的元素做比较,若比前面元素小,则交换位置,若前面还有元素,继续比较。若比前面元素大,则终止比较
代码实现
function insertSort($arr){
$count = count($arr)
for ($i=1;$i<$count;$i++){
for ($j=$i-1;$j>=0;$j--){
if ($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}else{
break; //当未排序的元素大于排序元素时,就不用比较了
}
}
}
return $arr;
}
冒泡排序
思想
元素按照顺序两两比较,若小于前面的元素则交换。
function bubbleSort($arr)
{
$count = count($arr);
for ($i = 0; $i < $count; $i++) {
for ($j = $i + 1; $j < $count; $j++){
if ($arr[$i]>$arr[$j]){
swap($arr,$i,$j);
}
}
}
return $arr;
}
希尔排序
思想
代码实现
堆排序
思想
例题
代码实现
归并排序
思想
例题
代码实现
function mergerSort($arr)
{
$temp = new SplFixedArray(count($arr)); //定义一个模板数组
sortArr($arr, 0, count($arr) - 1, $temp);
return $arr;
}
function sortArr(&$arr, $left, $right, $temp)
{
if ($left < $right) {
$mid = floor(($right + $left) / 2);
sortArr($arr, $left, $mid, $temp);
sortArr($arr, $mid + 1, $right, $temp);
merger($arr, $left, $mid, $right, $temp);
}
}
function merger(&$arr, $left, $mid, $right, $temp)
{
$i = $left;
$j = $mid+1;
$t = 0;
while ($i<=$mid&&$j<=$right){
if($arr[$i]<=$arr[$j]){
$temp[$t++]=$arr[$i++];
}else{
$temp[$t++]=$arr[$j++];
}
}
while ($i<=$mid){
$temp[$t++]=$arr[$i++];
}
while ($j<=$right){
$temp[$t++]=$arr[$j++];
}
$t=0;
while ($left<=$right){
$arr[$left++] = $temp[$t++];
}
return $arr;
}
快速排序
代码实现
function quickSort(array &$arr, $left, $right)
{
if ($left > $right) {
return;
}
$temp = $arr[$left]
$i = $left;
$j = $right;
while ($i != $j) {
while ($i < $j && $arr[$j] >= $temp) {
$j--;
}
while ($i < $j && $arr[$i] <= $temp) {
$i++;
}
if ($i < $j) {
swap($arr, $i, $j);
}
}
$arr[$left] = $arr[$i];//因为我们从右边开始,所以最后碰到的数字必然比我们的关键数据小。
$arr[$i] = $temp;
quickSort($arr, $left, $i - 1);//继续处理左边的,这里是一个递归的过程
quickSort($arr, $i + 1, $right);//继续处理右边的 ,这里是一个递归的过
}
# 注解: