常見基於選擇的排序演算法有氣泡排序、插入排序、選擇排序、歸併排序和快速排序,我們在選擇排序演算法的時候,通常會根據以下幾個維度來考慮:
時間複雜度
空間複雜度(對記憶體空間的消耗)
演算法的穩定性(如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變)
我們首先從氣泡排序開始。
實現原理
氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。
光看定義有點抽象,我們用圖來演示,假設待排序數字是 4、5、6、3、2、1,第一次排序的流程是這樣的:
看這個圖的時候要結合定義一起看,否則也比較懵逼,當然如果你去 visualgo 上看動態圖的話就更形象了:經過 n 次冒泡,最終完成排序(所謂冒泡,以公升序來看,就是每次把待排序序列中的最大值插到已排序序列的最前面,這個過程就像冒泡一樣):
示例**
重要的是理解氣泡排序的原理,懂了原理就是把這個排序過程翻譯成**而已,以下是 php **實現的氣泡排序:
<?php
/** * 氣泡排序實現函式(php)
* @param $nums
* @return mixed
*/function bubble_sort($nums)
for ($i = 0; $i < count($nums); $i++)
}if (!$flag)
}return $nums;
}$nums = [4, 5, 6, 3, 2, 1];
$nums = bubble_sort($nums);
print_r($nums);
可以看到我們對氣泡排序有個小小的優化,就是當某一次遍歷的時候發現沒有需要交換的元素,則認為整個序列已經排序完成。
效能分析
最後我們來看下氣泡排序的效能和穩定性:
時間複雜度: o(n^2)
空間複雜度:只涉及相鄰元素的交換,是原地排序演算法
演算法穩定性:元素相等不會交換,是穩定的排序演算法
時間複雜度是 o(n^2),看起來效能並不是很好,所以我們在實踐中基本不會選用冒泡演算法。
飛梭排序(氣泡排序的變形)
思路分析:飛梭排序是氣泡排序的輕微變形。不同的地方在於,飛梭排序是從低到高然後從高到低來回排序,而氣泡排序則僅從低到高去比較序列裡的每個元素。
先對陣列從左到右進行氣泡排序(公升序),則最大的元素去到最右端;
再對陣列從右到左進行氣泡排序(降序),則最小的元素去到最左端;
以此類推,依次改變冒泡的方向,並不斷縮小未排序元素的範圍,直到最後乙個元素結束。
php實現**示例:
function shuttlesort(array $data)
; $count = count($data);
$left = 0;
$right = $count - 1;
while ($left < $right)
}$right = $lastright;
// 從右到左
$lastleft = 0;
for ($j = $right; $left < $j; $j--)
}$left = $lastleft;
}return $data;
}var_dump(shuttlesort([6, 13, 21, 99, 18, 2, 25, 33, 19, 84]));
排序演算法 氣泡排序
一.氣泡排序的過程 公升值排序 1.將第乙個記錄的關鍵字與第二個記錄的關鍵字進行比較,若key 1 key 2 則交換。然後比較第二個與第三個,依此類推,直到第n 1個與第n個比較為止,第一趟排序完後,記錄最大的關鍵字會被排在最後面。2.將記錄的前n 1個關鍵字進行第二趟比較交換,直到前n 1個中最...
排序演算法 氣泡排序
從基礎重新抓起。氣泡排序 每次從陣列頭到尾選出最大或者最小的,排到尾部或者頭部。以排序結果從小到大為例 每次從陣列中把最大的調換到末尾。eg.元素個數 count,需要找count 1次 外迴圈,最後一次不用再做比較了 每次從頭到末尾沒有確定的資料中找最大的 內迴圈 做法就是比較相鄰兩個元素的大小,...
排序演算法 氣泡排序
排序演算法是處理資料最基礎的演算法,掌握各種排序演算法有利以後遇到資料時的處理。首次學習,先學習氣泡排序。氣泡排序原理 對一組待排序資料x1,x2,x3,x4,x5,x6,x7.xn,氣泡排序演算法指標 這裡的指標並不是實際的指標,只是為方便而假象的乙個類似指標的東西 從第乙個資料開始,與其後面的乙...