站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        PHP 排序算法原理及總結(jié)

        冒泡排序原理

        原理描述:

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

        流程:

        有一個(gè)無序數(shù)組 $arr = [8, 9, 3, 6, 1, 4]

        第一次外循環(huán) :找出最大值 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 大,交換位置。 第二次外循環(huán):找出第二大值 8,要倆倆相比,比 4 次。因?yàn)樯弦徊揭呀?jīng)找到最大值了。 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 大, 交換位置。 第三次外循環(huán):找出第三大的值 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 大,交換位置。 第四次外循環(huán):找出第四大的值 4,要倆倆相比,比 2 次。 1 3 4 6 8 9 第一次, 3 跟 1 比, 3 大,交換位置。 1 3 4 6 8 9 第二次, 3 跟 4 比, 4 大,位置不變。 第五次外循環(huán):找出第五大的值 3, 比一次就夠了。 1 3 4 6 8 9 比一次。1 跟 3 比,3 大,位置沒有變化。

        總結(jié):

        1. 外層循環(huán)要元素?cái)?shù) – 1次。負(fù)責(zé)找出最大值。

        2. 內(nèi)層循環(huán)逐層遞減一次。負(fù)責(zé)倆倆相比較,交換元素位置。

        代碼:

        <?php         function bubbleSort($arr)          {             $len = count($arr);//獲取元素個(gè)數(shù)             for ($i = 0; $i < $len - 1; $i ++) {//找出最大值                 $flag = 0;//做一個(gè)標(biāo)記                 for($j = 0; $j < $len - 1 - $i; $j++) {//倆倆相比較,交換位置                     if ($arr[$j] > $arr[$j + 1]) {                         //$temp = $arr[$j];//存當(dāng)前元素                         //$arr[$j] = $arr[$j + 1];//把當(dāng)前元素的值換成下一個(gè)元素的值                         //$arr[$j + 1] = $temp;//把下一個(gè)元素的值換成上一個(gè)元素的值。                         list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];//來自lovecn的評論,有時(shí)候思維有些固化。                         $flag = 1;//交換位置就記錄。                     }                 }                 if ($flag == 0) {//沒有發(fā)生交換位置,說明排序已經(jīng)完成??梢酝瞥鲅h(huán)。                     break;                 }             }             return $arr;         }

        快速排序原理(遞歸)

        原理描述:

        從數(shù)組中取第一個(gè)值作為參照物,比這個(gè)值小的放在左邊,比這個(gè)值大的放在右邊,這樣就會(huì)有倆個(gè)新的數(shù)組,遞歸處理倆個(gè)數(shù)組,然后左邊,參照物,右邊合并。注意:有遞歸就要找到遞歸出口,不然就會(huì)一直遞歸下去。

        流程:

        用文字?jǐn)⑹隽鞒烫闊?,就從網(wǎng)上找了一個(gè)圖片,過程很清晰。

        PHP 排序算法原理及總結(jié)

        代碼:

            <?php         function quickSort($arr)         {             $len = count($arr);             //遞歸出口             if($len <= 1) {                 return $arr;             }             $markValue = $arr[0];//參照物。             $left = $right = [];//定義左邊和右邊。             for($i = 1; $i < $len; $i++) {//從1開始循環(huán),因?yàn)榈谝粋€(gè)元素當(dāng)作參照物。                 if($arr[$i] > $markValue) {//大于參照物的放在右邊。                     $right[] = $arr[$i];                 } else {//小于和等于參照物的元素都放進(jìn)左邊,這樣會(huì)避免如果數(shù)組有重復(fù)元素時(shí),會(huì)漏掉元素。                     $left[] = $arr[$i];                 }             }             return array_merge(quickSort($left), [$markValue], quickSort($right));         }

        插入排序

        原理描述:

        將要排序的數(shù)組分成倆個(gè)部分,取數(shù)組第一個(gè)元素放有序集合中,剩下的放到無序集合中。將需要排序的數(shù),與前面已經(jīng)排好序的數(shù)據(jù)從后往前進(jìn)行比較,直到找到小于或者等于它的數(shù),使其插入到相應(yīng)的位置。

        我的記憶方法:

        假設(shè)有倆個(gè)箱子,第一個(gè)箱子是透明并且是空的,要用來裝有序元素,第二個(gè)箱子是不透明并且是滿的,裝無序元素。(其實(shí)裝什么都行,你喜歡的讓你容易記住的最好)。

        1.第一步:在不透明箱子里隨便拿一個(gè)元素,直接扔到透明的箱子里
        2.第二步:再從不透明的箱子里拿出一個(gè)元素,放進(jìn)透明箱子里前,做比較。如果大就放后面,如果小就放前面。
        3.重復(fù)第二步,但是我們每次需要比較的次數(shù)增加了,因?yàn)橥该飨渥永镌囟嗔?,直到找到合適的位置。

        流程:

        PHP 排序算法原理及總結(jié)

        <?php     function insertSort($arr)     {         $len = count($arr);         if ($len <= 1) {//一個(gè)元素或者沒有元素,排序無意義。             return $arr;         }         for($i = 0; $i < $len - 1; $i++) {             for($j = $i + 1; $j > 0; $j--){//每次比較次數(shù)增加。因?yàn)橛行蚣显卦谠黾印?                if ($arr[$j] < $arr[$j - 1]) {                     list($arr[$j], $arr[$j - 1]) = [$arr[$j - 1], $arr[$j]];//交換位置。                 }             }         }         return $arr;     }

        選擇排序

        原理描述:

        每次一次從數(shù)組中取出最小元素或者最大元素,放到指定位置。

        第一步:給第一個(gè)元素一個(gè)圣火令,和后面到每個(gè)元素比較,(我是取最小元素)。遇到比它小到元素就把這個(gè)圣火令給它,知道把圣火令交給最小元素手里。

        第二步:交換位置,圣火令交給第二哥元素,重復(fù)第一步。

        流程:

        PHP 排序算法原理及總結(jié)

        <?php     function selectSort($arr)     {         $len = count($arr);         if ($len <= 1) {//一個(gè)元素或者沒有元素,排序沒有意義。             return $arr;         }         for($i = 0; $i < $len - 1; $i++) {             $p = $i;//給第一個(gè)元素圣火令。             for($j =  $i + 1; $j < $len; $j++) {                 if ($arr[$j] < $arr[$p]) {//有圣火令的元素和后面的元素比較,把圣火令交給較小的元素。                     $p = $j;                 }             }             list($arr[$p], $arr[$i]) = [$arr[$i], $arr[p]];         }         return $arr;     }

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 一本之道av不卡精品| 久久精品国产精品亚洲艾草网美妙| 99热热久久这里只有精品68 | 欧美日韩在线精品一区二区三区激情综合 | 无码人妻一区二区三区精品视频 | 亚洲欧美国产∧v精品综合网| 国产韩国精品一区二区三区| 久久99精品综合国产首页| 欧产日产国产精品精品| 亚洲精品无码Av人在线观看国产| 青娱乐国产精品视频| 嫩草影院久久国产精品| 99国产欧美精品久久久蜜芽| 久久亚洲日韩精品一区二区三区| 亚洲精品无码AV中文字幕电影网站| 久久精品亚洲欧美日韩久久| 国产精品免费久久久久久久久| 99久久精品免费| 夜色www国产精品资源站| 华人在线精品免费观看| 国产精品久久久久久久| 国产在视频线精品视频二代| 久久国产精品国产自线拍免费 | 综合人妻久久一区二区精品| 久久久精品国产亚洲成人满18免费网站 | 成人伊人精品色XXXX视频| 国产精品三级国产电影| 精品人妻系列无码天堂| 国产精品日韩欧美一区二区三区| …久久精品99久久香蕉国产| 国产精品国产三级国产专播| 华人亚洲欧美精品国产| 丝袜美腿国产精品视频一区| 99久久精品这里只有精品| 国产999精品久久久久久| 国产精品亚洲玖玖玖在线观看 | 精品乱子伦一区二区三区| 精品人妻少妇一区二区三区在线| 欧美激情精品久久久久久久九九九| 亚洲成网777777国产精品| 尤物yw午夜国产精品视频|