排序算法
记录一下最近学习的各种排序算法。
目录:
选择排序
选择排序是最简单且容易想到的排序方法。它把输入值(以下均以列表为例)分为两个部分:已排序 和 未排序部分。
先看一组伪代码:
for (i = 0; i < numbersSize - 1; ++i){
//找到未排序部分中最小值的索引值
indexSmallest = i
for (j = i + 1; i < numbersSize; ++j){
if (numbers[j] < numbers[indexSmallest]){
indexSmallest = j
}
}
//找到余下值中最小的索引值,与第i个值交换。若没找到则不变
temp = numbers[i]
numbers[i] = numbers[indexSmallest
numbers[indexSmallest] = temp
}
思路:
- 两个循环把列表分为已排序和未排序两部分,用 i,j 去表示
- 该算法找到未排序中最小值的索引值
- 把索引值上的元素与i元素交换
- i,j 更新,表示出新的已排序未排序部分
- 直到 i 小于长度 -1,遍历停止。因为不再需要单独遍历最后一个元素。
时间复杂度:O(n^2)
该算法或将运行多次比较。当列表长度为N时,外层循环将执行 N - 1 次。在这些外循环中,内层循环每次将执行平均 N / 2 次。所以,(N - 1) x (N / 2) = O(N ^ 2)。此算法也是众多排序算法中最慢的算法之一。
插入排序
同样的,插入排序也将列表分为已排序和未排序部分。不同的是,此算法每次只在未排序部分中提取第一个元素,然后把它放到已排序部分中合适的位置。
先看一组伪代码:
for (i = 1; i < numbersSize; ++i){
j = 1
//把第i个元素放入到已排序的部分(第二个元素开始。默认第一个元素是以排好部分)
//i已经到第一个位置时,或当第i个元素放入到正确位置时,停止while循环。
while (j > 0 && number[j] < numbers[j - 1]){
//把第i位的数和前一位交换 [j]和[j-1]
temp