• 排序算法--(二)


    选择排序

    直接选择排序:

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

    typedef int T;
    void SelectSort(T a[],int length)
    {
        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]);
        }
    }

    复杂度分析:

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

    堆排序:

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

    http://blog.csdn.net/clam_clam/article/details/6799763 

    //调整为大顶堆
    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只是起条件判断作用,并不参与实际计算。
       }
    }

    void HeapSort(int *a,int size)    //堆排序 
    {
    int i;
    BuildHeap(a,size);
    for(i=size;i>=1;i--)
    {
    //cout<<a[1]<<" ";
    swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
    //BuildHeap(a,i-1); //将余下元素重新建立为大顶堆
    HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆
    }
    }
     

    补充:

    复杂度表:

    B_$OTOG(U$RT2%3OL]RIHLA

    稳定性:

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

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

    排序算法选择:

    1.数据规模较小

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

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

    2.数据规模不是很大

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

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

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

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

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

    算法总结:http://blog.csdn.net/morewindows/article/details/7961256

  • 相关阅读:
    使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
    《大道至简》第三章读后感
    动手动脑
    zencart设置特价商品价格
    如何设置zencart买满多少免运费?
    zencart分类页每页显示产品数量自定义选择的方法
    Access数据库LIKE问题
    zencart清空产品商品实用命令
    dedecms织梦后台发布文章提示“标题不能为空”的解决办法
    zencart重置用户登录密码sql
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3774919.html
Copyright © 2020-2023  润新知