您的位置:首页 > 编程语言 > C语言/C++

各种排序算法的C++实现

2012-11-02 18:56 253 查看
  内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序和分配排序。其中,插入排序主要包括直接插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括气(冒)泡排序和快速排序。
  稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序,选择,快速,希尔,堆属于不稳定排序。

  就地排序:若排序算法所需的辅助空间并不依赖于问题的规模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)的排序方法:快速排序、堆排序或归并排序。
   快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
   堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
   若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: