排序演算法之選擇排序類

2022-05-28 03:15:12 字數 2004 閱讀 6952

我們可以從圖上可以看出,我們先迴圈找出最小的元素。我們的第二個迴圈是找出最小的元素,第乙個迴圈是負責交換值的,第一趟排序外層迴圈的指標指向陣列的第乙個,這個時候我們找出陣列的最小值,和外層指標交換數值,就把最小的放在第乙個,後面的同理。

注意:1、重點在於先迴圈找出最小的值,再去交換;

<?php 

function selectsort(array &$arr)

}if($min != $i)

} var_dump($arr);

} $arr = [5,2,6,0,3,9,1,7,4,8];

selectsort($arr);

排序類別

排序方法

時間複雜度

空間複雜度

穩定性平均情況

最壞情況

最好情況

選擇排序類

簡單選擇排序

o(n2)

o(n2)

o(1)

穩定1、什麼是大頂堆,和小頂堆?

堆排序是在完全二叉樹的結構上建立的。完全二叉樹就是每乙個父節點都有左孩子和右孩子兩個子節點並且他的葉節點是有順序的,從左到右是連續的;

上圖就是完全二叉樹,大頂堆就是根節點是二叉樹裡面最大的值並且父節點的值要比兩個子節點的值都要大;小頂堆反過來。

2、具體的流程

注意:我以大頂堆為例

第一步:我們現將目標陣列,構建成完全二叉樹的結構;

第二步:我們將已經轉化後的完全二叉樹的根節點和陣列最後的乙個元素進行互換位置,換完了以後,有可能打破完全二叉樹的結構,這時我們再將目標陣列構建大頂堆,但是要去掉陣列的最大值,也就是陣列的長度減1。

/***description:用於兩個數之間的交換

*@param:int a

*@param:int b

*@param:array arr

*/ function swap(array &$arr, $a, $b)

/***description:將原陣列構建為乙個大頂堆

*@param:int start

*@param:int end

*@param:array arr

**/function heapadjest(array &$arr, $start, $end)

if($temp > $arr[$i])

//將根節點設定為子節點較大的值

$arr[$start] = $arr[$i];

$start = $i;

} $arr[$start] = $temp;

} /**

*description:堆排序的主函式

*@param:array arr

**/function heapsort(array &$arr)

for ($i = $len - 1; $i >= 0; $i--)

} $arr = array(9,1,5,8,3,7,4,6,2);

heapsort($arr);

var_dump($arr);

注意:1、在構建大頂堆的時候,我們先要判斷左右孩子那個大,在和大的交換位置;

排序類別

排序方法

時間複雜度

空間複雜度

穩定性平均情況

最壞情況

最好情況

選擇排序類

堆排序o(n*log2n)

o(n*log2n) 

o(n*log2n) 

o(1)

不穩定

排序演算法 選擇類排序

選擇排序的演算法思想 重待排序的元素序列中選擇最小 最大 的元素,將其放入在已排序序列的最前 最末 其餘的元素構成新的待排序列。依次類推,直到待排序元素序列中沒有待排元素。選擇排序主要有兩種 簡單選擇排序和堆排序。接下來我們來分別介紹一下這兩種排序演算法。演算法思想 簡單選擇排序是一種簡單的選擇類排...

排序演算法 排序演算法之選擇排序

最近在學習排序演算法,就排序演算法中的四大經典排序 氣泡排序 快速排序 選擇排序 插入排序。會出一系列的講解排序演算法的部落格。今天繼快速排序之後整理一下選擇排序。選擇排序,就是從一列未排序的陣列中先選出最小 最大 的數,放在陣列的第一位,第一位原來的數字放在最小的原來的位置,再選出第二小的數,放在...

排序演算法之選擇排序 選擇排序 堆排序

直接選擇排序 如下 下面 是一次迴圈同時挑選出最大和最小數,並將其與左右交換 選擇排序 void selectionsort int a,int len swap a min a left 如果最大數的下標在為left,證明要交換的最大數已經被 換到min小標所表示的位置,只需要將right和min...