排序算法简单讲解
图说排序
复杂度比较
排序法 | 稳定度 | 平均时间 | 最差情形 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡排序 | 稳定 | n小时较好 | |||
选择排序 | 不稳定 | n小时较好 | |||
插入排序 | 稳定 | 大部分已排序时较好 | |||
堆排序 | 不稳定 | n大时较好 | |||
归并排序 | 稳定 | n大时较好 | |||
快速排序 | 不稳定 | n大时较好 | |||
桶排序 | 稳定 | 将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。 |
简单实现
C++实现排序算法:
1 |
|
C++测试用例:
1 |
|
延伸问题及解答
排序算法可以延伸解决其他问题,以下是几个例子:
问题1 给定序列,Random shuffle 随机化序列(洗牌算法)
思路:类似与选择排序。随机选择第1到第i之间的数与第i交换,可以用一句伪代码表达 for i:=1 to n do swap(a[i], a[random(1,i)]);
证明:见这里
1 |
|
输出结果:
1 |
|
问题2 给定序列,求序列的逆序数
思路:可以用类似 冒泡排序 或 归并排序 解决来求解。冒泡排序的思路,计数第i个数向右侧冒泡的次数,累计冒泡总数。归并排序的思路,每次归并两个已排序序列发现右侧逆序数可以根据左侧序列所剩长度求和求得,具体逻辑见代码。归并排序的思路有更好的时间效率
证明:略
1 |
|
输出结果:
1 |
|