1. 程式人生 > >php實現八種排序演算法

php實現八種排序演算法

<?php
/**
 * Created by PhpStorm.
 * User: frowhy
 * Date: 2017/4/4
 * Time: 04:14
 *
 *_______________%%%%%%%%%_______________________
 *______________%%%%%%%%%%%%_____________________
 *______________%%%%%%%%%%%%%____________________
 *_____________%%__%%%%%%%%%%%___________________
 *____________%%%__%%%%%%_%%%%%__________________
 *____________%%%_%%%%%%%___%%%%_________________
 *___________%%%__%%%%%%%%%%_%%%%________________
 *__________%%%%__%%%%%%%%%%%_%%%%_______________
 *________%%%%%___%%%%%%%%%%%__%%%%%_____________
 *_______%%%%%%___%%%_%%%%%%%%___%%%%%___________
 *_______%%%%%___%%%___%%%%%%%%___%%%%%%_________
 *______%%%%%%___%%%__%%%%%%%%%%%___%%%%%%_______
 *_____%%%%%%___%%%%_%%%%%%%%%%%%%%__%%%%%%______
 *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%_%%%%%%%_____
 *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%____
 *___%%%%%%%__%%%%%%_%%%%%%%%%%%%%%%%%_%%%%%%%___
 *___%%%%%%%__%%%%%%_%%%%%%_%%%%%%%%%___%%%%%%___
 *___%%%%%%%____%%__%%%%%%___%%%%%%_____%%%%%%___
 *___%%%%%%%________%%%%%%____%%%%%_____%%%%%____
 *____%%%%%%________%%%%%_____%%%%%_____%%%%_____
 *_____%%%%%________%%%%______%%%%%_____%%%______
 *______%%%%%______;%%%________%%%______%________
 *________%%_______%%%%________%%%%______________
 */
namespace Frowhy\Algorithm; class Algorithm { public static function quickSort($arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } $left = $right = []; for ($i =
1; $i < $len; $i++) { if ($arr[$i] < $arr[0]) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } $left = self::quickSort($left); $right = self::quickSort($right); return array_merge($left
, [$arr[0]], $right); } static function array_swap($arr, $l, $r) { $arr[$l] = $arr[$l] ^ $arr[$r]; $arr[$r] = $arr[$l] ^ $arr[$r]; $arr[$l] = $arr[$l] ^ $arr[$r]; return $arr; } public static function bubbleSort($arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } for ($i = 1; $i < $len; $i++) { $max_j = $len - $i; for ($j = 0; $j < $max_j; $j++) { if ($arr[$j] > $arr[$j + 1]) { $arr = self::array_swap($arr, $j, $j + 1); } } } return $arr; } public static function selectionSort($arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } for ($i = 0; $i < $len; $i++) { $min_i = $arr[$i]; $index = $i; $min_j = $i + 1; for ($j = $min_j; $j < $len; $j++) { if ($arr[$j] < $min_i) { $min_i = $arr[$j]; $index = $j; } } if ($i < $index) { $arr = self::array_swap($arr, $i, $index); } } return $arr; } public static function insertionSort($arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } for ($i = 0; $i < $len; $i++) { $pre_i = $i - 1; $current = $arr[$i]; while ($pre_i >= 0 && $arr[$pre_i] > $current) { $arr[$pre_i + 1] = $arr[$pre_i]; $pre_i -= 1; } $arr[$pre_i + 1] = $current; } return $arr; } public static function shellSort($arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } $gap = 1; $pre_i = $len / 3; while ($gap < $pre_i) { $gap = $gap * 3 + 1; } while ($gap > 0) { for ($i = 0; $i < $len; $i++) { $temp = $arr[$i]; $j = $i - $gap; while ($j >= 0 and $arr[$j] > $temp) { $arr[$j + $gap] = $arr[$j]; $j -= $gap; } $arr[$j + $gap] = $temp; } $gap = floor($gap / 3); } return $arr; } public static function mergeSort(&$arr) { if (! is_array($arr)) { return false; } $len = count($arr); if ($len <= 1) { return $arr; } $mid = $len >> 1; $left = array_slice($arr, 0, $mid); $right = array_slice($arr, $mid); static::mergeSort($left); static::mergeSort($right); if (end($left) <= $right[0]) { $arr = array_merge($left, $right); } else { for ($i = 0, $j = 0, $k = 0; $k <= $len - 1; $k++) { if ($i >= $mid && $j < $len - $mid) { $arr[$k] = $right[$j++]; } elseif ($j >= $len - $mid && $i < $mid) { $arr

相關推薦

php實現排序演算法

<?php /** * Created by PhpStorm. * User: frowhy * Date: 2017/4/4 * Time: 04:14 * *_______________%%%%%%%%%_____________________

Java常用的排序演算法與程式碼實現(三):桶排序、計數排序、基數排序

三種線性排序演算法:桶排序、計數排序、基數排序 線性排序演算法(Linear Sort):這些排序演算法的時間複雜度是線性的O(n),是非比較的排序演算法 桶排序(Bucket Sort)   將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序,桶內排完序之後,再把桶裡的

Java常用的排序演算法與程式碼實現(二):歸併排序法、快速排序

注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort):   分而治之,遞迴實現   如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了   歸併排序是穩定的排序演算法,時間

python實現排序演算法

1.快速排序 排序思想: 1.從數列中挑出一個元素,稱為"基準"(pivot) 2.重新排序數列,所有比基準值小的元素放在基準前面,比基準大的元素放在基準後面。在這個分割槽結束之後,該基準就處於數列的中間位置,這就是分割槽操作。 3.遞迴地把小於基準的子數列和大於基準的子數列排序

Java常用的排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序

這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

排序演算法Java實現-希爾排序

/*********希爾排序先從0定義再到gap*********************/ public static int[] shell2(int []num,int len){

排序演算法-Java實現

1.選擇排序 基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。 程式碼實現 p

Java常用的排序演算法與程式碼實現(一)

本文需要5分鐘左右閱讀完成,建議收藏以後閱讀,裡面都是乾貨,可以親自試驗一下,如果覺得好用可以幫忙點贊轉發一下,謝謝!交流學習java大資料可以加群460570824。 1.直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數

排序演算法原理及實現

一:氣泡排序氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序演算法的運作如下:(從後

C/C++的排序演算法實現

  最近看排序演算法的書籍,記錄下自己的心得和總結。關於幾種常見排序的原理和實現。(快速排序借了別人的步驟描述,可以很清晰的理解每一趟怎麼跑的) 首先說下穩定排序和非穩定排序,簡單地說就是所有相等的數

一遍記住Java常用的排序演算法與程式碼實現

1.直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數排序,然後構成一個有序序列將第三個數插入進去,構成一個新的有序序列。對第四個數、第五個數……直到最後一個數,重複第二步。 如何寫寫成程式碼: 首先設定插入次數,即迴圈

常用的排序演算法與Java程式碼實現

1.直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數排序,然後構成一個有序序列 將第三個數插入進去,構成一個新的有序序列。 對第四個數、第五個數……直到最後一個數,重複第二步。

Java 常用的排序演算法與程式碼實現

寫排序演算法是一個大工程,估計得好多天才可以寫完。。。就慢慢寫吧。未完待續。。。。 內部排序和外部排序 內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裡說說八大排序就是

Java常用的排序演算法與程式碼實現--轉載

1.直接插入排序      我們經常會到這樣一類排序問題:把新的資料插入到已經排好的資料列中。將第一個數和第二個數排序,然後構成一個有序序列將第三個數插入進去,構成一個新的有序序列。對第四個數、第五個數……直到最後一個數,重複第二步。如題所示:直接插入排序(Straight

排序演算法總結(Java實現

        排序演算法有很多,在特定情景中使用哪一種演算法很重要。本文對幾種常見排序演算法做了簡單的總結。 一、氣泡排序         氣泡排序(BubbleSort)是一種簡單的排序演算法。它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交

用java實現排序演算法

 很多時候,聽別人在討論快速排序,選擇排序,氣泡排序等,都覺得很牛逼,心想,臥槽,排序也分那麼多種,就覺得別人很牛逼呀,其實不然,當我們自己去了解學習後發現,並沒有想象中那麼難,今天就一起總結一下各種排序的實現原理並加以實現。                         -WH 一、文章

排序演算法的時間複雜度複雜度

https://www.cnblogs.com/dll-ft/p/5861210.html 轉載 1、穩定性 歸併排序、氣泡排序、插入排序。基數排序是穩定的 選擇排序、快速排序、希爾排序、堆排序是不穩定的   2、時間複雜度 最基礎的四個演算法:冒泡、選擇

Java語言實現排序演算法

Java語言實現六種排序演算法 Java語言實現六種排序演算法 氣泡排序 插入排序 歸併排序 快速排序 希爾排序 選擇排序

C語言實現排序演算法

C語言實現六種排序演算法 C語言實現六種排序演算法 氣泡排序 插入排序 歸併排序 快速排序 希爾排序

java排序演算法

氣泡排序   氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。   氣泡排序的示例: &nbs