各种排序算法的C++实现
2012-11-02 18:56
337 查看
内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序和分配排序。其中,插入排序主要包括直接插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括气(冒)泡排序和快速排序。
稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序,选择,快速,希尔,堆属于不稳定排序。
就地排序:若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。
1、插入排序:
测试代码
按平均时间将排序分为四类:
(1)平方阶(O(n2))排序:一般称为简单排序,例如直接插入、直接选择和冒泡排序;
(2)线性对数阶(O(nlgn))排序:如快速、堆和归并排序;
(3)O(n1+£)阶排序:£是介于0和1之间的常数,即0<£<1,如希尔排序;
(4)线性阶(O(n))排序:如桶、箱和基数排序。
不同条件下,排序方法的选择:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜。
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序,选择,快速,希尔,堆属于不稳定排序。
就地排序:若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。
1、插入排序:
测试代码
void main() { while (1) { vector<int> _v; int n; cout<<"请输入有序顺序表的元素个数n:"<<endl; cin>>n; srand((unsigned)time(0)); for (int i=0;i<n;i++) { _v.push_back(rand()%100); } for (int i=0;i<_v.size();i++) { cout<<_v[i]<<" "; } cout<<endl; //Inser_Sort(_v); //Inser_Sort_Guard(_v); //ShellSort(_v, Delta, 4); //BubbleSort(_v); //QSort(_v, 0, _v.size() - 1); //QSort_NoRecursive_S(_v, 0, _v.size() - 1); //SelectSort(_v); //HeapSort(_v); MSort(_v, 0, _v.size() - 1); for (int i=0;i<_v.size();i++) { cout<<_v[i]<<" "; } cout<<endl; system("pause"); } }
按平均时间将排序分为四类:
(1)平方阶(O(n2))排序:一般称为简单排序,例如直接插入、直接选择和冒泡排序;
(2)线性对数阶(O(nlgn))排序:如快速、堆和归并排序;
(3)O(n1+£)阶排序:£是介于0和1之间的常数,即0<£<1,如希尔排序;
(4)线性阶(O(n))排序:如桶、箱和基数排序。
不同条件下,排序方法的选择:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜。
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
相关文章推荐
- 各种排序算法的C++实现
- 各种排序算法的c++代码实现
- 各种排序算法的C++实现
- 各种排序算法的C++实现
- 各种排序算法的实现及其比较(c++实现)
- C++实现各种排序算法
- 各种排序算法C++实现
- 各种排序算法及其C++实现
- 数据结构——算法之(043)(c++各种排序算法实现)
- C/C++:各种基本算法实现小结(五)—— 排序算法
- 各种排序算法--c++实现
- c++代码实现各种排序算法
- 各种排序算法的C++实现
- 各种排序算法的对比与C++实现
- 各种排序算法学习整理 C++实现
- C++ 各种排序算法实现
- 各种常见排序算法的C++实现
- 各种排序算法的C++实现与性能比较
- 各种排序算法的实现及其比较(c++实现)
- 各种排序算法的C++实现