首頁  >  文章  >  後端開發  >  PHP 排序演算法原理及總結

PHP 排序演算法原理及總結

藏色散人
藏色散人轉載
2019-10-17 13:30:472232瀏覽

冒泡排序原理

原理描述:

一次比較兩個相鄰的元素,大的元素後移,小的元素前移(交換位置)。直到找出最大的元素。就像是氣泡一樣,大的向下沉,小的向上冒。

流程:

有一個無序陣列$arr = [8, 9, 3, 6, 1, 4]

第一次外循环 :找出最大值 9,要俩俩相比,比 5 次。
8 9 3 6 1 4 第一次, 8 跟 9 比,9 大,所以没有交换位置。
8 3 9 6 1 4 第二次, 9 跟 3 比, 9 大,交换位置。
8 3 6 9 1 4 第三次, 9 跟 6 比, 9 大,交换位置。
8 3 6 1 9 4 第四次, 9 跟 1 比, 9 大,交换位置。
8 3 6 1 4 9 第五次, 9 跟 4 比, 9 大,交换位置。
第二次外循环:找出第二大值 8,要俩俩相比,比 4 次。因为上一步已经找到最大值了。
3 8 6 1 4 9 第一次,8 跟 3 比,8 大, 交换位置。
3 6 8 1 4 9 第二次,8 跟 6 比,8 大, 交换位置。
3 6 1 8 4 9 第三次,8 跟 1 比,8 大, 交换位置。
3 6 1 4 8 9 第四次,8 跟 4 比,8 大, 交换位置。
第三次外循环:找出第三大的值 6,要俩俩相比,比三次。
3 6 1 4 8 9 第一次,3 跟 6 比,6 大,位置没有变化。
3 1 6 4 8 9 第二次,6 跟 1 比,6 大,交换位置。
3 1 4 6 8 9 第三次,6 跟 4 比,6 大,交换位置。
第四次外循环:找出第四大的值 4,要俩俩相比,比 2 次。
1 3 4 6 8 9 第一次, 3 跟 1 比, 3 大,交换位置。
1 3 4 6 8 9 第二次, 3 跟 4 比, 4 大,位置不变。
第五次外循环:找出第五大的值 3, 比一次就够了。
1 3 4 6 8 9 比一次。1 跟 3 比,3 大,位置没有变化。

總結:

1. 外層循環要元素數- 1次。負責找出最大值。

2. 內層循環逐層遞減一次。負責倆倆相比較,交換元素位置。

程式碼:

 $arr[$j + 1]) {
                        //$temp = $arr[$j];//存当前元素
                        //$arr[$j] = $arr[$j + 1];//把当前元素的值换成下一个元素的值
                        //$arr[$j + 1] = $temp;//把下一个元素的值换成上一个元素的值。
                        list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];//来自lovecn的评论,有时候思维有些固化。
                        $flag = 1;//交换位置就记录。
                    }
                }
                if ($flag == 0) {//没有发生交换位置,说明排序已经完成。可以推出循环。
                    break;
                }
            }
            return $arr;
        }

快速排序原理(遞歸)

原理描述:

從陣列中取第一個值作為參照物,比這個值小的放在左邊,比這個值大的放在右邊,這樣就會有兩個新的數組,遞歸處理兩個數組,然後左邊,參考物,右邊合併。注意:有遞歸就要找到遞迴出口,不然就會一直遞歸下去。

流程:

用文字敘述流程太麻煩,就從網路上找了一個圖片,過程很清晰。

PHP 排序演算法原理及總結

#程式碼:

     $markValue) {//大于参照物的放在右边。
                    $right[] = $arr[$i];
                } else {//小于和等于参照物的元素都放进左边,这样会避免如果数组有重复元素时,会漏掉元素。
                    $left[] = $arr[$i];
                }
            }
            return array_merge(quickSort($left), [$markValue], quickSort($right));
        }

插入排序

原理描述:

#將要排序的數組分成兩個部分,取數組第一個元素放有序集合中,剩下的放到無序集合中。將需要排序的數,與前面已經排好序的資料從後往前比較,直到找到小於或等於它的數,使其插入到對應的位置。

我的記憶方法:

假設有兩個箱子,第一個箱子是透明並且是空的,要用來裝有序元素,第二個箱子是不透明並且是滿的,裝無序元素。 (其實裝什麼都行,你喜歡的讓你容易記得的最好)。

1.第一步:在不透明箱子裡隨便拿一個元素,直接丟到透明的箱子裡
2.第二步:再從不透明的箱子裡拿出一個元素,放進透明箱子裡前,做比較。如果大就放後面,如果小就放前面。
3.重複第二步,但我們每次需要比較的次數增加了,因為透明箱子裡元素多了,直到找到合適的位置。

流程:

PHP 排序演算法原理及總結

 0; $j--){//每次比较次数增加。因为有序集合元素在增加。
                if ($arr[$j] < $arr[$j - 1]) {
                    list($arr[$j], $arr[$j - 1]) = [$arr[$j - 1], $arr[$j]];//交换位置。
                }
            }
        }
        return $arr;
    }

選擇排序

原則描述:

每次一次從陣列中取出最小元素或最大元素,放到指定位置。

第一步:給第一個元素一個聖火令,和後面到每個元素比較,(我是取最小元素)。遇到比它小到元素就把這個聖火令給它,知道要把聖火令交給最小元素手裡。

第二步:交換位置,聖火令交給第二哥元素,重複第一步。

流程:

PHP 排序演算法原理及總結


以上是PHP 排序演算法原理及總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除