学习过程主要依照中国MOOC课程,感谢MOOC,感谢浙大授课大佬。
这里只讨论内部排序,即默认内存空间足够大,可以存放下所有需要排序的数据。
简单排序(冒泡、插入)
冒泡排序
从上到下比较两个相邻的泡泡,小在上,大在下则不动,否则交换顺序。这为第一趟冒泡,保证将最大的元素放到最下边,然后重复冒泡,直到所有元素均排好序。
最好情况:顺序T=O(N)
最坏情况:倒序T=O(N2)
插入排序
类比于打牌时抓牌的过程。
最好情况:顺序T=O(N)
最坏情况:倒序T=O(N2)
1 | void InsertionSort( ElementType A[], int N ) |
时间复杂度下界
对于下标i<j,如果A[i]>A[j],则称(i,j)是一对逆序对。
冒泡排序和插入排序中需要交换的次数即逆序对数,也就是每次交换消除一个逆序对。
希尔排序
1 | void ShellSort( ElementType A[], int N ) |
堆排序
选择排序
在i从0到N的循环里,从A[i]到A[i-1]中找到最小元,并将其位置赋给MinPostion,将未排序部分的最小元换到有序部分的最后位置,即交换A[i]和A[MinPostion]。
堆排序
将找最小元用最小堆来解决。
1 | void Swap( ElementType *a, ElementType *b ) |
归并排序
核心:有序子列的归并
递归算法
分而治之,T(N)=O(NlogN)
1 | /* 归并排序 - 递归实现 */ |
非递归算法
1 | /* 归并排序 - 循环实现 */ |
以上。
注:转载文章请注明出处,谢谢~