PHP 尋找數組第i小元素

來源:互聯網
上載者:User
 1 <?php 2     #隨機播放第i小的數字,用隨機快排實現 3      4     #交換元素 5     function swap(&$arr, $i, $j) { 6         $temp = $arr[$i]; 7         $arr[$i] = $arr[$j]; 8         $arr[$j] = $temp; 9     }10 11     #隨機劃分12     function randomized_partition(&$arr, $begin, $end) {13         $rand_inx = rand($begin, $end);14         swap($arr, $begin, $rand_inx);15         return partition($arr, $begin, $end);16     }17 18     #劃分19     function partition(&$arr, $begin, $end) {20         #以第一個元素作為中樞元素21         $pivot = $begin;22         $low = $begin;23         $high = $end;24 25         while ($low < $high) {26             while ($low < $high && $arr[$low] <= $arr[$pivot]) {27                 $low++;28             }29 30             while ($low < $high && $arr[$high] >= $arr[$pivot]) {31                 $high--;32             }33 34             swap($arr, $low, $high);35         }36 37         #交換中樞元素38         if ($arr[$pivot] < $arr[$low]) {39             $low--;40         }41         swap($arr, $pivot, $low);42         return $low;43     }44 45     #快速排序,此處沒用到46     function quick_sort(&$arr, $begin, $end) {47         $q = randomized_partition($arr, $begin, $end);48         if ($q > $begin) {49             quick_sort($arr, $begin, $q - 1);50         }51         if ($q < $end) {52             quick_sort($arr, $q + 1, $end);53         }54     }55 56     #選取第i小的數57     function randomized_select(&$arr, $begin, $end, $i) {58         if ($begin == $end) {59             return $arr[$begin];60         }61 62         $q = randomized_partition($arr, $begin, $end);63         $k = $q - $begin + 1; #k代表小於等於q的元素個數64 65         if ($k == $i) { #如果k=i,說明q就是第i小的元素座標66             return $arr[$q];67         } else if ($i < $k) { #如果i<k,說明第i小的元素位於q的左邊68             return randomized_select($arr, $begin, $q - 1, $i);69         } else { #第i小的元素位於q的右邊,此時尋找右邊的第i-k小的元素70             return randomized_select($arr, $q + 1, $end, $i - $k);71         }72     }73 74     $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);75     $t = randomized_select($arr, 0, count($arr) - 1, 8);76     print_r("The 8th minimum element: {$t}");77     echo "<br>";78     quick_sort($arr, 0, count($arr) - 1);79     print_r($arr);80 ?>

The 8th minimum element: 7
Array ( [0] => 0 [1] => 0 [2] => 1 [3] => 2 [4] => 3 [5] => 4 [6] => 5 [7] => 7 [8] => 8 [9] => 9 [10] => 11 )

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.