摘要:冒泡排序?qū)τ谝粋€長度為的數(shù)組,我們需要排序輪,每輪要比較次。對此我們可以用雙重循環(huán)語句,外層循環(huán)控制循環(huán)輪次,內(nèi)層循環(huán)控制每輪的比較次數(shù)。將這個元素插入到已經(jīng)排序好的序列內(nèi)。
冒泡排序
對于一個長度為N的數(shù)組,我們需要排序 N-1 輪,每 i 輪 要比較 N-i 次。對此我們可以用雙重循環(huán)語句,外層循環(huán)控制循環(huán)輪次,內(nèi)層循環(huán)控制每輪的比較次數(shù)。
$arr = [2,3,1,8,4,5]; $length = count($arr); for ($i=0;$i<$length;$i++) { for ($j=0;$j<$i-1;$j++) { if ($arr[$i] > $arr[$j]) { $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } for ($i=0;$i<$length-1;$i++) { echo "i:" . $i . " "; for ($j=0;$j<$length-1-$i;$j++) { echo "j:" .$j . " "; if ($arr[$j] > $arr[$j+1]) { $tmp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $tmp; print_r($arr); } } echo " "; } print_r($arr);選擇排序
每一輪比較都可以確定一個位置,對于N個數(shù),比較N-1輪可以確定N個位置上的數(shù),因為確定了N-1個位置,最后一個位置也就確定了
for($i=0; $i<$count-1; $i++){ //定義最小位置 $minIndex = $i; for($j= $i+1; $j<$count; $j++){ if($arr[$j] < $arr[$minIndex]){ $minIndex = $j; } } if($i != $minIndex){ $temp = $arr[$i]; $arr[$i] = $arr[$minIndex]; $arr[$minIndex] = $temp; } }快速排序
1、先從數(shù)列中取出一個數(shù)作為基準(zhǔn)數(shù)2、分區(qū)過程,將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊
3、再對左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個數(shù)
function quick_sort($arr) { if (empty($arr)) { return $arr; } $length = count($arr); if ($length == 1) { return $arr; } // 將第一個值設(shè)置為基準(zhǔn)值 $base = $arr[0]; $left = $right = []; for($i = 1; $i < $length; $i++) { if ($base < $arr[$i]) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } // 遞歸調(diào)用 $left = quick_sort($left); $right = quick_sort($right); return array_merge($left, [$base], $right); }插入排序
對于插入排序,我的理解是 兩層循環(huán)下 逐漸增加排序的數(shù)量,不斷的重復(fù)比較直到得到最終的排序結(jié)果,跟我最初的比較排序思路基本是一致的
function insert_sort($arr) { //區(qū)分 哪部分是已經(jīng)排序好的 //哪部分是沒有排序的 //找到其中一個需要排序的元素 //這個元素 就是從第二個元素開始,到最后一個元素都是這個需要排序的元素 //利用循環(huán)就可以標(biāo)志出來 //i循環(huán)控制 每次需要插入的元素,一旦需要插入的元素控制好了, //間接已經(jīng)將數(shù)組分成了2部分,下標(biāo)小于當(dāng)前的(左邊的),是排序好的序列 for($i=1, $len=count($arr); $i<$len; $i++) { //獲得當(dāng)前需要比較的元素值。 $tmp = $arr[$i]; //內(nèi)層循環(huán)控制 比較 并 插入 for($j=$i-1;$j>=0;$j--) { //$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素 if($tmp < $arr[$j]) { //發(fā)現(xiàn)插入的元素要小,交換位置 //將后邊的元素與前面的元素互換 $arr[$j+1] = $arr[$j]; //將前面的數(shù)設(shè)置為 當(dāng)前需要交換的數(shù) $arr[$j] = $tmp; } else { //如果碰到不需要移動的元素 //由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。 break; } } } //將這個元素 插入到已經(jīng)排序好的序列內(nèi)。 //返回 return $arr; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28449.html
摘要:本文將介紹快速排序計數(shù)排序梳排序堆排序歸并排序希爾排序選擇排序插入排序地精排序聯(lián)合冒泡排序雞尾酒排序冒泡排序奇偶排序使用標(biāo)志的冒泡排序種排序算法的實現(xiàn)。是一種不穩(wěn)定的排序算法。 本文將介紹快速排序、計數(shù)排序、梳排序、堆排序、歸并排序、希爾排序、選擇排序、插入排序、地精排序、聯(lián)合冒泡排序、雞尾酒排序、冒泡排序、奇偶排序、使用標(biāo)志的冒泡排序14種排序算法的實現(xiàn)。本文是由于閱讀了文章《測試評...
摘要:數(shù)據(jù)項是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項是對客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。 項目地址 https://github.com/m9rco/algo... 每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse 簡...
摘要:數(shù)據(jù)項是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項是對客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。 項目地址 https://github.com/m9rco/algo... 每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse 簡...
摘要:數(shù)據(jù)項是數(shù)據(jù)的不可分割的最小單位。數(shù)據(jù)項是對客觀事物某一方面特性的數(shù)據(jù)描述。數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集。數(shù)據(jù)的邏輯結(jié)構(gòu)數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)。 項目地址 https://github.com/m9rco/algo... 每周最少一更,求出題,求虐待 At least once a week, ask for problems and abuse 簡...
摘要:在算法中,比快速排序還快的,無疑是基數(shù)排序,粗略看了一下算法,可能是基礎(chǔ)排序中的桶排序。桶排序是穩(wěn)定的桶排序是常見排序里最快的一種,比快排還要快大多數(shù)情況下桶排序非???,但是同時也非常耗空間以空間換時間 ext/standard/php_array.h https://github.com/php/php-src/blob/master/ext/standard/php_array....
閱讀 1124·2021-09-22 16:04
閱讀 1505·2019-08-30 15:43
閱讀 1111·2019-08-29 14:01
閱讀 3447·2019-08-26 12:19
閱讀 3363·2019-08-26 12:15
閱讀 1454·2019-08-26 12:13
閱讀 3273·2019-08-23 17:00
閱讀 1492·2019-08-23 15:38