码迷,mamicode.com
首页 > 其他好文 > 详细

排序算法--(二)

时间:2014-06-07 21:10:36      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

选择排序

直接选择排序:

选择排序,每一趟找到一个最小(大)值,每一趟遍历的数据减少一次。

bubuko.com,布布扣
template <typename T>
void SelectSort(T a[],int length)
{
    T temp;
    for (int i=0;i<length;i++)
    {
        int k =i;
        for (int j=i+1;j<length;j++)
        {
            if (a[j]<a[k])
                k=j;           //这里只是对比它小的元素中最小的位置进行标记,每次相当于最多移动一次。
        }
        if(k!=i)
            swap(a[i],a[k]);
    }
}
bubuko.com,布布扣

复杂度分析:

可以看出,选择排序过程中所需要进行记录移动的操作次数最少为0,最大值为3(n-1)。然而,无论记录的初始排序如何,所需进行的关键字间的比较次数相同。均为n(n-1)/2.所以时间复杂度为O(n2),附加存储空间为O(1)。

堆排序:

由于堆排序是一个完全二叉树,则在实际操作过程中,我们通常用一维数组存储一个堆。

bubuko.com,布布扣
//调整为大顶堆
void shift(int a[],int i,int length)
{
   int j=2*i;
   while(j<=(length-1))              //j<=(length-1)表示存在子树(左子树或者右子树)的时候就要进行判断
   {
      if(j<(length-1)&&a[j]<a[j+1])  //j<(length-1) 表示当存在右子树的时候
          j++;
      if(a[i]<a[j])
          swap(a[i],a[j]);

      i=j;j=2*i;
   }
}

//建堆
void createHeap(int &a[],int n)
{
   int i; 
   for (i=n/2;i>0;i--)
   {
      shift(a,i,n);                   //n只是起条件判断作用,并不参与实际计算。
   }
}
bubuko.com,布布扣

补充:

复杂度表:

bubuko.com,布布扣

稳定性:

稳定的排序算法:插入排序,冒泡排序,归并排序。

不稳定排序算法:选择排序,希尔排序,快速排序,堆排序。

排序算法选择:

1.数据规模较小

  (1)待排序列基本序的情况下,可以选择直接插入排序

  (2)对稳定性不作要求宜用选择排序,对稳定性有要求宜用插入或冒泡

2.数据规模不是很大

(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。

(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序

3.海量级别的数据,必须按块放在外存上

   (1)对稳定性有求,则可考虑归并排序。

    (2)对稳定性没要求,宜用堆排序

排序算法--(二),布布扣,bubuko.com

排序算法--(二)

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/menghuizuotian/p/3774919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!