算法归类
简单排序:插入排序、选择排序、冒泡排序(必学)
分治排序:快速排序、归并排序(必学)
分配排序:桶排序、基数排序
树状排序:堆排序(必学)
其他:计数排序(必学)、希尔排序
快速排序
原理:核心思想是通过一个支点进行数据拆分,左边的数据小于这个支点,右边的数据大于支点,然后把左边和右边的做一次递归,直到递归结束。
phpcode实现
$data = array(2, 1, 3, 9, 4, 6, 5, 8, 7);
$dataNum = count($data);
$leftIndex = 0;
$rightIndex = $dataNum - 1;
quickSort($data, $leftIndex, $rightIndex);
print_r($data);
function quickSort(&$data, $leftIndex, $rightIndex) {
$i = $leftIndex;
$j = $rightIndex;
$pivot = $data[floor(($leftIndex+$rightIndex) / 2)];
while($i <= $j) {
while($data[$i] < $pivot) {
$i++;
}
while($data[$j] > $pivot) {
$j--;
}
if($i <= $j) {
if($i != $j) {
$temp = $data[$j];
$data[$j] = $data[$i];
$data[$i] = $temp;
}
$i++;
$j--;
}
}
if($leftIndex < $j) {
quickSort($data, $leftIndex, $j);
}
if($i < $rightIndex) {
quickSort($data, $i, $rightIndex);
}
return $data;
}
gocode实现
package main
import "fmt"
func main() {
data := [9]int{2, 1, 3, 9, 4, 6, 5, 8, 7}
dataNum := len(data)
leftIndex := 0
rightIndex := dataNum - 1
quickSort(&data, leftIndex, rightIndex)
fmt.Println(data)
}
func quickSort(data *[9]int, leftIndex, rightIndex int) {
i := leftIndex
j := rightIndex
pivot := data[(leftIndex+rightIndex)/2]
for i <= j {
for data[i] < pivot {
i++
}
for data[j] > pivot {
j--;
}
if i <= j {
if i != j {
data[i], data[j] = data[j], data[i]
}
i++
j--
}
}
if i < rightIndex {
quickSort(data, i, rightIndex)
}
if leftIndex < j {
quickSort(data, leftIndex, j)
}
}
稳定性:不稳定排序
空间复杂度
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况原地排序
时间复杂度:
平均情况:O(n log n)
最坏情况:O(n² )
最好情况:O(n log n)
来源:CSDN
作者:小马哥~
链接:https://blog.csdn.net/onlymayao/article/details/104244464