快速排序算法php,快速排序算法c++代碼

本文目錄一覽:

PHP中的快速排序算法如何實現倒序?

您好,這樣的:

1. 冒泡排序法

* 思路分析:法如其名,就是像冒泡一樣,每次從數組當中 冒一個最大的數出來。

* 比如:2,4,1 // 第一次 冒出的泡是4

* 2,1,4 // 第二次 冒出的泡是 2

* 1,2,4 // 最後就變成這樣

view sourceprint?

01.$arr=array(1,43,54,62,21,66,32,78,36,76,39);

02.function getpao($arr)

03.{

04.$len=count($arr);

05.//設置一個空數組 用來接收冒出來的泡

06.//該層循環控制 需要冒泡的輪數

07.for($i=1;$i$len;$i++)

08.{ //該層循環用來控制每輪 冒出一個數 需要比較的次數

09.for($k=0;$k$len-$i;$k++)

10.{

11.if($arr[$k]$arr[$k+1])

12.{

13.$tmp=$arr[$k+1];

14.$arr[$k+1]=$arr[$k];

15.$arr[$k]=$tmp;

16.}

17.}

18.}

19.return $arr;

20.}

2. 選擇排序法:

選擇排序法思路: 每次選擇一個相應的元素,然後將其放到指定的位置

view sourceprint?

01.function select_sort($arr) {

02.//實現思路 雙重循環完成,外層控制輪數,當前的最小值。內層 控制的比較次數

03.//$i 當前最小值的位置, 需要參與比較的元素

04.for($i=0, $len=count($arr); $i$len-1; $i++) {

05.//先假設最小的值的位置

06.$p = $i;

07.//$j 當前都需要和哪些元素比較,$i 後邊的。

08.for($j=$i+1; $j$len; $j++) {

09.//$arr[$p] 是 當前已知的最小值

10.if($arr[$p] $arr[$j]) {

11.//比較,發現更小的,記錄下最小值的位置;並且在下次比較時,

12.// 應該採用已知的最小值進行比較。

13.$p = $j;

14.}

15.}

16.//已經確定了當前的最小值的位置,保存到$p中。

17.//如果發現 最小值的位置與當前假設的位置$i不同,則位置互換即可

18.if($p != $i) {

19.$tmp = $arr[$p];

20.$arr[$p] = $arr[$i];

21.$arr[$i] = $tmp;

22.}

23.}

24.//返回最終結果

25.return $arr;

26.}

3.插入排序法

插入排序法思路:將要排序的元素插入到已經 假定排序號的數組的指定位置。

view sourceprint?

01.function insert_sort($arr) {

02.//區分 哪部分是已經排序好的

03.//哪部分是沒有排序的

04.//找到其中一個需要排序的元素

05.//這個元素 就是從第二個元素開始,到最後一個元素都是這個需要排序的元素

06.//利用循環就可以標誌出來

07.//i循環控制 每次需要插入的元素,一旦需要插入的元素控制好了,

08.//間接已經將數組分成了2部分,下標小於當前的(左邊的),是排序好的序列

09.for($i=1, $len=count($arr); $i$len; $i++) {

10.//獲得當前需要比較的元素值。

11.$tmp = $arr[$i];

12.//內層循環控制 比較 並 插入

13.for($j=$i-1;$j=0;$j–) {

14.//$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素

15.if($tmp $arr[$j]) {

16.//發現插入的元素要小,交換位置

17.//將後邊的元素與前面的元素互換

18.$arr[$j+1] = $arr[$j];

19.//將前面的數設置為 當前需要交換的數

20.$arr[$j] = $tmp;

21.} else {

22.//如果碰到不需要移動的元素

23.//由於是已經排序好是數組,則前面的就不需要再次比較了。

24.break;

25.}

26.}

27.}

28.//將這個元素 插入到已經排序好的序列內。

29.//返回

30.return $arr;

31.}

4.快速排序法

view sourceprint?

01.function quick_sort($arr) {

02.//先判斷是否需要繼續進行

03.$length = count($arr);

04.if($length = 1) {

05.return $arr;

06.}

07.//如果沒有返回,說明數組內的元素個數 多餘1個,需要排序

08.//選擇一個標尺

09.//選擇第一個元素

10.$base_num = $arr[0];

11.//遍歷 除了標尺外的所有元素,按照大小關係放入兩個數組內

12.//初始化兩個數組

13.$left_array = array();//小於標尺的

14.$right_array = array();//大於標尺的

15.for($i=1; $i$length; $i++) {

16.if($base_num $arr[$i]) {

17.//放入左邊數組

18.$left_array[] = $arr[$i];

19.} else {

20.//放入右邊

21.$right_array[] = $arr[$i];

22.}

23.}

24.//再分別對 左邊 和 右邊的數組進行相同的排序處理方式

25.//遞歸調用這個函數,並記錄結果

26.$left_array = quick_sort($left_array);

27.$right_array = quick_sort($right_array);

28.//合併左邊 標尺 右邊

29.return array_merge($left_array, array($base_num), $right_array);

30.}

php幾種排序算法實例詳解

四種排序算法的PHP實現:

1) 插入排序(Insertion Sort)的基本思想是: 

每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到全部記錄插入完成為止。

2) 選擇排序(Selection Sort)的基本思想是: 

每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最後,直到全部記錄排序完畢。

3) 冒泡排序的基本思想是: 

兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。

4) 快速排序實質上和冒泡排序一樣,都是屬於交換排序的一種應用。所以基本思想和上面的冒泡排序是一樣的。

1. sort.php文件如下:

?php

class Sort {

  private $arr  = array(); 

  private $sort  = ‘insert’;

  private $marker = ‘_sort’;

  private $debug = TRUE;

  /**

   * 構造函數

   *

   * @param  array  例如:

   $config = array (

   ‘arr’ = array(22,3,41,18) , //需要排序的數組值

   ‘sort’ = ‘insert’, //可能值: insert, select, bubble, quick

   ‘debug’ = TRUE //可能值: TRUE, FALSE

   )

   */

  public function construct($config = array()) {

    if ( count($config)  0) {

      $this-_init($config);

    }

  }

  /**

   * 獲取排序結果

   */

  public function display() {

    return $this-arr;

  }

  /**

   * 初始化

   *

   * @param  array

   * @return bool

   */

  private function _init($config = array()) {

    //參數判斷

    if ( !is_array($config) OR count($config) == 0) {

      if ($this-debug === TRUE) {

        $this-_log(“sort_init_param_invaild”);

      }

      return FALSE;

    }

    //初始化成員變量

    foreach ($config as $key = $val) {

      if ( isset($this-$key)) {

        $this-$key = $val;

      }

    }

    //調用相應的成員方法完成排序

    $method = $this-sort . $this-marker;

    if ( ! method_exists($this, $method)) {

      if ($this-debug === TRUE) {

        $this-_log(“sort_method_invaild”);

      }

      return FALSE;

    }

    if ( FALSE === ($this-arr = $this-$method($this-arr)))

      return FALSE;

    return TRUE;

  }

  /**

   * 插入排序

   * 

   * @param  array

   * @return bool

   */

  private function insert_sort($arr) {

    //參數判斷

    if ( ! is_array($arr) OR count($arr) == 0) {

      if ($this-debug === TRUE) {

        $this-_log(“sort_array(insert)_invaild”);

      }

      return FALSE;

    }

    //具體實現

    $count = count($arr);

    for ($i = 1; $i  $count; $i++) {

      $tmp = $arr[$i];

      for($j = $i-1; $j = 0; $j–) { 

        if($arr[$j]  $tmp) {

          $arr[$j+1] = $arr[$j];

          $arr[$j] = $tmp;

        }

      }

    }

    return $arr;

  }

  /**

   * 選擇排序

   * 

   * @param  array

   * @return bool

   */

  private function select_sort($arr) {

    //參數判斷

    if ( ! is_array($arr) OR count($arr) == 0) {

      if ($this-debug === TRUE) {

        $this-_log(“sort_array(select)_invaild”);

      }

      return FALSE;

    }

    //具體實現

    $count = count($arr);

    for ($i = 0; $i  $count-1; $i++) {

      $min = $i;

      for ($j = $i+1; $j  $count; $j++) {

        if ($arr[$min]  $arr[$j]) $min = $j;

      }

      if ($min != $i) {

        $tmp = $arr[$min];

        $arr[$min] = $arr[$i];

        $arr[$i] = $tmp;

      }

    }

    return $arr;

  }

  /**

   * 冒泡排序

   * 

   * @param  array

   * @return bool

   */

  private function bubble_sort($arr) {

    //參數判斷

    if ( ! is_array($arr) OR count($arr) == 0) {

      if ($this-debug === TRUE) {

        $this-_log(“sort_array(bubble)_invaild”);

      }

      return FALSE;

    }

    //具體實現

    $count = count($arr);

    for ($i = 0; $i  $count; $i++) {

      for ($j = $count-1; $j  $i; $j–) {

        if ($arr[$j]  $arr[$j-1]) {

          $tmp = $arr[$j];

          $arr[$j] = $arr[$j-1];

          $arr[$j-1] = $tmp;

        }

      }

    }

    return $arr;  

  }

  /**

   * 快速排序

   * @by 

   * @param  array

   * @return bool

   */

  private function quick_sort($arr) {

    //具體實現

    if (count($arr) = 1) return $arr; 

    $key = $arr[0];

    $left_arr = array();

    $right_arr = array();

    for ($i = 1; $i  count($arr); $i++){

      if ($arr[$i] = $key)

        $left_arr[] = $arr[$i];

      else

        $right_arr[] = $arr[$i];

    }

    $left_arr = $this-quick_sort($left_arr);

    $right_arr = $this-quick_sort($right_arr); 

  

    return array_merge($left_arr, array($key), $right_arr);

  }

  /**

   * 日誌記錄

   */

  private function _log($msg) {

    $msg = ‘date[‘ . date(‘Y-m-d H:i:s’) . ‘] ‘ . $msg . ‘\n’;

    return @file_put_contents(‘sort_err.log’, $msg, FILE_APPEND);

  }

}

/*End of file sort.php*/

/*Location htdocs/sort.php */

2. sort_demo.php文件如下:

?php

require_once(‘sort.php’);

$config = array (

  ‘arr’ = array(23, 22, 41, 18, 20, 12, 200303,2200,1192) ,

  //需要排序的數組值

  ‘sort’ = ‘select’,

  //可能值: insert, select, bubble, quick

  ‘debug’ = TRUE

  //可能值: TRUE, FALSE

);

$sort = new Sort($config);

//var_dump($config[‘arr’]);

var_dump($sort-display());

/*End of php*/

php快速排序算法

?php

function quick_sort($arr) {

// 判斷是否需要繼續

if (count($arr) = 1) {

return $arr;

}

$middle = $arr[0]; // 中間值

$left = array(); // 小於中間值

$right = array();// 大於中間值

// 循環比較

for ($i=1; $i count($arr); $i++) {

if ($middle $arr[$i]) {

// 大於中間值

$right[] = $arr[$i];

} else {

// 小於中間值

$left[] = $arr[$i];

}

}

// 遞歸排序兩邊

$left = quick_sort($left);

$right = quick_sort($right);

// 合併排序後的數據,別忘了合併中間值

return array_merge($left, array($middle), $right);

}

$arr = array(25,133,452,364,5876,293,607,365,8745,534,18,33);

echo ‘pre’;

var_dump($arr);

var_dump(quick_sort($arr));

PHP快速排序算法實現的原理及代碼詳解

算法原理

下列動圖來自五分鐘學算法,演示了快速排序算法的原理和步驟。

步驟:

從數組中選個基準值

將數組中大於基準值的放同一邊、小於基準值的放另一邊,基準值位於中間位置

遞歸的對分列兩邊的數組再排序

代碼實現

function

quickSort($arr)

{

$len

=

count($arr);

if

($len

=

1)

{

return

$arr;

}

$v

=

$arr[0];

$low

=

$up

=

array();

for

($i

=

1;

$i

$len;

++$i)

{

if

($arr[$i]

$v)

{

$up[]

=

$arr[$i];

}

else

{

$low[]

=

$arr[$i];

}

}

$low

=

quickSort($low);

$up

=

quickSort($up);

return

array_merge($low,

array($v),

$up);

}

測試代碼:

$startTime

=

microtime(1);

$arr

=

range(1,

10);

shuffle($arr);

echo

“before

sort:

“,

implode(‘,

‘,

$arr),

“\n”;

$sortArr

=

quickSort($arr);

echo

“after

sort:

“,

implode(‘,

‘,

$sortArr),

“\n”;

echo

“use

time:

“,

microtime(1)

$startTime,

“s\n”;

測試結果:

before

sort:

1,

7,

10,

9,

6,

3,

2,

5,

4,

8

after

sort:

1,

2,

3,

4,

5,

6,

7,

8,

9,

10

use

time:

0.0009009838104248s

時間複雜度

快速排序的時間複雜度在最壞情況下是O(N2),平均的時間複雜度是O(N*lgN)。

這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間複雜度是O(N),需要遍歷多少次呢?至少lg(N+1)次,最多N次。

1)

為什麼最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數最少是lg(N+1)次。

2)

為什麼最多是N次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數最多是N次。

您可能感興趣的文章:PHP快速排序算法實例分析PHP四種排序算法實現及效率分析【冒泡排序,插入排序,選擇排序和快速排序】PHP排序算法之快速排序(Quick

Sort)及其優化算法詳解PHP遞歸實現快速排序的方法示例php

二維數組快速排序算法的實現代碼PHP常用排序算法實例小結【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort實例詳解

PHP實現常見的排序算法

註:為方便描述,下面的排序全為正序(從小到大排序)

假設有一個數組[a,b,c,d]

冒泡排序依次比較相鄰的兩個元素,如果前面的元素大於後面的元素,則兩元素交換位置;否則,位置不變。具體步驟:

1,比較a,b這兩個元素,如果ab,則交換位置,數組變為:[b,a,c,d]

2,比較a,c這兩個元素,如果ac,則位置不變,數組變為:[b,a,c,d]

3,比較c,d這兩個元素,如果cd,則交換位置,數組變為:[b,a,d,c]

完成第一輪比較後,可以發現最大的數c已經排(冒)在最後面了,接着再進行第二輪比較,但第二輪比較不必比較最後一個元素了,因為最後一個元素已經是最大的了。

第二輪比較結束後,第二大的數也會冒到倒數第二的位置。

依次類推,再進行第三輪,,,

就這樣最大的數一直往後排(冒),最後完成排序。所以我們稱這種排序算法為冒泡排序。

選擇排序是一種直觀的算法,每一輪會選出列中最小的值,把最小值排到前面。具體步驟如下:

插入排序步驟大致如下:

快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的數據,可以決定設計的選擇,減少所需時間的二次方項之可能性。

步驟:

從數列中挑出一個元素,稱為 「基準」(pivot),

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。

遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/278847.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-20 15:02
下一篇 2024-12-20 15:02

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29

發表回復

登錄後才能評論