请问如下排序到底是什么排序算法?

2016-06-20 23:32:19 +08:00
 Jakesoft
$len = count($arr);

for ($i = 0; $i < $len; $i++) {
    for ($j = 0; $j < $i; $j++) {
        if ($arr[$i] < $arr[$j]) {
            $temp = $arr[$i];
            $arr[$i] = $arr[$j];
            $arr[$j] = $temp;
        }
    }
}

感觉不像冒泡排序:一开始就得到最大值或者最小值

也不像选择排序,身边找不到人解答,

就当破事水来一发咯。

3768 次点击
所在节点    PHP
34 条回复
kingddc314
2016-06-21 00:41:30 +08:00
说是冒泡,却不是比较相邻元素
说是插入,又是通过从前向后交换而不是从后向前插入
所以这大概是冒插算法吧
hinkal
2016-06-21 00:50:26 +08:00
@Jakesoft 仔细看了下,这个并不是无用的比较,你想想,如果直接吧 3 , 4 , 8 这一段后移,你还得写一个带控制变量 i 的 for 循环, for 循环中 i 也需要比较啊!而且还会产生额外的临时变量。 https://gist.github.com/padeoe/9e04ab9550eb90daa7e46493e8888934
upczww
2016-06-21 00:55:03 +08:00
一大堆$,怪不得 PHP 是最好的语言,有钱
Jakesoft
2016-06-21 01:00:32 +08:00
@hinkal 嗯是的, a[j] = tmp;后面加一个 break;就好了,防止继续比较。哎,要睡觉了
hinkal
2016-06-21 01:05:51 +08:00
@Jakesoft 哎呀,忘记 break 了,已修改。也睡觉了
hcwhan
2016-06-21 01:18:47 +08:00
bravecarrot
2016-06-21 01:30:12 +08:00
插入排序嘛
zjbztianya
2016-06-21 10:01:52 +08:00
其实更像选择排序
stormpeach
2016-06-21 10:25:56 +08:00
插入排序,始终维护的是一个有序的序列。

把第一个循环的$i = 0 换成$i = 1,第二个循环的$j = 0 换成$j = $i - 1 就是冒泡排序
hooluupog
2016-06-21 11:31:15 +08:00
这是插入排序。
arr[0->j](j < i)是已经有序的子序列(升序);
arr[i]是当前待排元素,和有序子序列依次比较寻找插入位置。
fri3nds
2016-06-21 11:57:51 +08:00
@best1a 只是没有优化,没有利用已排好数据!交换次数比较多而已!
Jakesoft
2016-06-21 12:31:36 +08:00
可以结帖了,总结各位+自己的分析这是插入排序,插入排序的原理是维持一个排序的数列,然后 拿新的数字跟里面的逐一比较,网上找到的比较是从新数字的左临边向最左边比较,我的是总最左边开始比较,附上`常见的`插入排序:

```
for ($i = 1; $i < $len ; $i++) {
$temp = $arr[$i];
for ($j = $i -1 ; $j >= 0 ; $j--){
if($arr[$j] > $temp){
$arr[$j + 1] = $arr[$j];
}else{
break;
}
}
$arr[$j + 1] = $temp;
}
```
Jakesoft
2016-06-21 12:33:18 +08:00
@kingddc314 被你发现了,哈哈,不过这个原理来说应该算是插排
lz3259
2016-06-21 16:29:41 +08:00
@Jakesoft 加上一个 break 就完全不一样了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287163

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX