排序演算法 氣泡排序 飛梭排序

2022-09-12 01:12:22 字數 1834 閱讀 6700

常見基於選擇的排序演算法有氣泡排序、插入排序、選擇排序、歸併排序和快速排序,我們在選擇排序演算法的時候,通常會根據以下幾個維度來考慮:

時間複雜度

空間複雜度(對記憶體空間的消耗)

演算法的穩定性(如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變)

我們首先從氣泡排序開始。

實現原理

氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 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,氣泡排序演算法指標 這裡的指標並不是實際的指標,只是為方便而假象的乙個類似指標的東西 從第乙個資料開始,與其後面的乙...