三种O(n^2)的排序算法
排序算法的稳定性:所有相等的数经过某种排序方法后,仍能保持它们在排序前的相对次序,我们称这种排序算法是稳定的。反之,就是非稳定算法。
内排序:在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的顺序,称为内排序。
外排序:在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的相对顺序,称为外排序。
1、插入排序
分三个步骤:
- 在在A[1..i-1]中查找A[i]的插入位置,A[1..j].key <= A[i].key < A[j+1..i-1].key;
- 将A[j+1..i-1]中的所有记录均后移一个位置;
- 将A[i]插入(复制)到A[j+1]的位置上。
1
2
3
4
5
6template<typename E,typename Comp>
void inssort(E A[],int n){
for(int i = 1;i <= n;i ++)
for(int j = i;(j>0) && (Comp::prior(A[j],A[j-1]);j --))//如果A[j]>A[j-1],交换
swap(A[j],A[j-1]);
}
2、冒泡排序
1 | template<typename E,typename Comp> |
3、选择排序
假设当前下标为最小值的下标,向后遍历,一直更新最小值的下标,找到尽头,交换最小值和当前值。更新当前下标,持续上述,直至当前下标为最后一个元素下标。
选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面,或者将最大值放在最后面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择,每一趟从前往后查找出无序区最小值,将最小值交换至无序区最前面的位置。
1 | template<typename T> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Tmr's Blog!
评论