首頁 後端開發 php教程 php实现快速排序的三种方法分享_php实例

php实现快速排序的三种方法分享_php实例

May 17, 2016 am 08:47 AM
快速排序

写了三种php快速排示例,第一种效率低但最简单最容易理解,第二个是算法导论上提供的单向一次遍历找中值方法,第三种是双向遍历找中值经典快排算法。三组算法实现和比较如下:

方法一:该方法比较直观,但损失了大量的空间为代价,使用了效率较低的merge函数。在三种方法中效率最低。最坏情况下算法退化为(O(n*n))

复制代码 代码如下:

function quick_sort($array) {
 if(count($array)  $key = $array[0];
 $rightArray = array();
 $leftArray = array();
 for($i = 1; $i            if($array[$i] >= $key) {
  $rightArray[] = $array[$i];
    } else {
  $leftArray[] = $array[$i];
    }
 }
 $leftArray = quick_sort($leftArray);
 $rightArray = quick_sort($rightArray);
 return array_merge($leftArray, array($key), $rightArray);
}


方法二:该算法来自算法导论,叫作Nico Lomuto方法(感兴趣goole上有详细说明)使用最经典的单方向一次遍历找到中值。
但这种算法在最坏情况下(例如值相同的数组,需要n-1次划分,每一次划分需要O(n) 时间去掉一个元素)最坏情况下为O(n*n)

复制代码 代码如下:

function quick_sort(&$array, $start, $end) {
    if ($start >= $end) return;
    $mid = $start;
    for ($i = $start + 1; $i  if ($array[$i]      $mid++;
     $tmp = $array[$i];
     $array[$i] = $array[$mid];
     $array[$mid] = $tmp;
 }
    }
    $tmp = $array[$start];
    $array[$start] = $array[$mid];
    $array[$mid] = $tmp;
    quick_sort($array, $start, $mid - 1);
    quick_sort($array, $mid + 1, $end);
}

方法三:该方法基本上是教科书式的常见写法,首先从左向右遍历小于中间元素的跳过,同时从右向左遍历遇到大的元素跳过,然后

如果没有交叉着交换两边值,继续循环,直到找到中间点。注意该方法在处理相同元素的时候,仍旧交换,这样在最坏情况下也有O(nlogn)

效率。但下面的函数中,如果将$array[$right] > $key 改成 $array[$right] >=$key 或将 $array[$left]

情况不但会堕落为O(n*n).而且除了每次比较的消耗外,还会产生n次交互的额外开销。该题还有另外两个考点,针对死记硬背的同学:

1:中间的两个while可否互换。当然不能互换,因为对于快盘需要一个额外的空间保存初始的左值,这样左右互换的时候,先用右边覆盖已经保存

为中值的左值,否则会出现问题。见这句$array[$left] = $array[$right];

2:$array[$right] = $key; 该语句含义可否省略。该句不能省略,大家可以考虑一个极端情况比如两个值的排序(5,2),逐步看下就明白了。

复制代码 代码如下:

function quick_sort_swap(&$array, $start, $end) {
 if($end  $key = $array[$start];
 $left = $start;
 $right = $end;
 while($left   while($left $key)
   $right--;
  $array[$left] = $array[$right];
  while($left    $left++;
  $array[$right] = $array[$left];
 }
 $array[$right] = $key;
 quick_sort_swap(&$array, $start, $right - 1);
 quick_sort_swap(&$array, $right+1, $end);
}
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

用Python怎麼實現快速排序 用Python怎麼實現快速排序 Dec 18, 2023 pm 03:37 PM

用Python實現快速排序的方法:1、定義一個名為quick_sort的函數,使用遞歸的方法來實現快速排序;2、檢查數組的長度,如果長度小於等於1,則直接傳回數組,否則,選擇數組中的第一個元素作為樞紐元素(pivot),然後將數組分成比樞紐元素小和比樞紐元素大的兩個子數組;3、將這兩個子數組和樞紐元素連接起來,形成排序好的數組即可。

Java快速排序技巧及注意事項 Java快速排序技巧及注意事項 Feb 25, 2024 pm 10:24 PM

掌握Java快速排序的關鍵技巧和注意事項快速排序(QuickSort)是一種常用的排序演算法,其核心思想是透過選擇一個基準元素,將待排序序列分割成獨立的兩部分,其中一部分的所有元素均小於基準元素,另一部分的所有元素都大於基準元素,然後對這兩部分分別進行遞歸排序,最終得到有序序列。雖然快速排序在平均情況下的時間複雜度為O(nlogn),但在最壞情況下會退化為O

Java實現的快速排序演算法及其效率評估 Java實現的快速排序演算法及其效率評估 Feb 18, 2024 pm 03:38 PM

快速排序的Java實作及其效能分析快速排序(QuickSort)是一種很常用且高效的排序演算法,它是一種分治法(DivideandConquer)的想法。此演算法透過將一個數組分成兩個子數組,然後將這兩個子數組分別排序,最終將整個數組變成有序序列。在處理大規模資料時,快速排序表現出了非常出色的效能。快速排序的實作採取遞歸的方式,基本想法如下:選擇一個基

在PHP中使用陣列函數進行快速排序 在PHP中使用陣列函數進行快速排序 Jun 16, 2023 am 08:54 AM

PHP是一種非常流行的程式語言,它廣泛用於Web開發。在PHP中,陣列是一種非常常見的資料類型,也是一種非常強大的資料結構。正因為如此,PHP提供了許多陣列函數來幫助開發人員處理和操作陣列。其中包括快速排序函數,可以幫助我們快速對陣列進行排序。快速排序是一種常見的排序演算法,它的基本思想是透過比較和交換來將一個數組分成兩個子數組,一個比另一個小,然後遞歸地對每

如何使用java實作快速排序演算法 如何使用java實作快速排序演算法 Sep 19, 2023 am 11:28 AM

如何使用Java實作快速排序演算法快速排序(QuickSort)是常用且有效率的排序演算法。它的基本思想是採用分治法(DivideandConquer)的策略,透過每次選取一個元素作為基準值,將待排序數組劃分為兩部分,一部分小於基準值,一部分大於基準值,然後分別對兩部分進行遞歸排序,最終實現整個數組的排序。以下我們將詳細介紹如何使用Java語言實現快速排

java如何快速排序函數 java如何快速排序函數 Jan 18, 2024 pm 05:26 PM

快速排序方法:1、建立一個Java範例檔;2、透過quickSort方法實作快速排序演算法;3、選擇數組中的一個元素為主元(pivot),並將陣列分成兩個子數組,一個包含比主元小的元素,另一個包含比主元大的元素,然後對這兩個子數組遞歸地應用快速排序演算法;4、在main方法中對數組進行了排序並輸出結果即可。

評估Java快速排序的效率與效能 評估Java快速排序的效率與效能 Feb 19, 2024 pm 10:16 PM

Java快速排序的效能分析及比較快速排序(QuickSort)是一種基於比較的排序演算法,因其快速的執行速度和較好的效能表現而廣泛應用於實際開發中。本文將對Java中的快速排序演算法進行效能分析,並與其他常見的排序演算法進行比較。快速排序演算法原理快速排序採用分治法的思想,透過將待排序的資料分割成獨立的兩部分,分別對左右子序列遞歸地進行排序,從而達到整個序列有序的

優化與實作原理:Java中的快速排序 優化與實作原理:Java中的快速排序 Feb 20, 2024 pm 01:24 PM

Java快速排序函數的實作原理與最佳化快速排序是一種高效的排序演算法,它的實作思想是透過分治法將一個大問題分割成多個小問題,透過遞歸解決子問題,最終獲得整體的解。在快速排序中,我們需要選擇一個基準元素,將陣列分成兩個部分,一部分小於基準元素,一部分大於基準元素。然後對這兩部分再次進行快速排序,直到每個子問題只有一個元素。最後將所有子問題的解合併起來,即可得到數組的

See all articles