修煉內功 資料結構與演算法11 歸併排序

2021-09-05 07:39:25 字數 1007 閱讀 1655

所謂歸併排序

指的是如果要排序乙個陣列

我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,這樣整個陣列就都有序了

歸併排序使用了分治思想

分治,顧名思義,就是分而治之,將乙個大問題分解成小的子問題來解決

歸併排序就是通過遞迴來實現的

這個遞迴的公式是每次都將傳入的待排序陣列一分為二,直到不能分割,然後將排序後序列合併,最終返回排序後的陣列

<?php

function merge_sort($nums)

merge_sort_c($nums, 0, count($nums) - 1);

return $nums;

}function merge_sort_c(&$nums, $p, $r)

$q = floor(($p + $r) / 2);

merge_sort_c($nums, $p, $q);

merge_sort_c($nums, $q + 1, $r);

merge($nums, ['start' => $p, 'end' => $q], ['start' => $q + 1, 'end' => $r]);

}function merge(&$nums, $nums_p, $nums_q)

else

}if ($i <= $nums_p['end'])

}if ($j <= $nums_q['end'])

}for ($x = 0; $x < $k; $x++)

}$nums = [4, 5, 6, 3, 2, 1];

$nums = merge_sort($nums);

print_r($nums);

歸併排序不涉及相等元素位置交換,是穩定的排序演算法

時間複雜度是 o(nlogn),要優於 o(n^2)

但是歸併排序需要額外的空間存放排序資料,不是原地排序,最多需要和待排序陣列同樣大小的空間,所以空間複雜度是 o(n)

修煉內功 資料結構與演算法10 選擇排序

選擇排序演算法的實現思路有點類似插入排序 也分已排序區間和未排序區間 但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾 選擇排序演算法實現 function selection sort nums for i 0 i count nums i if min i return ...

修煉內功 資料結構與演算法6 佇列

通過 php 陣列實現的佇列 class queue 入隊 public function enqueue value array push this queue,value 出隊 public function dequeue array shift 將 array 的第乙個單元移出並作為結果返回...

修煉內功 資料結構與演算法9 插入排序

插入排序的原理我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。插入排序實現...