码迷,mamicode.com
首页 > 编程语言 > 详细

选择排序

时间:2015-07-15 18:57:23      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

一.简单选择排序
1.基本思想:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。
template <typename Comparable>
void selectSort (vector<Comparable>&)
{//找出按从小到大排序应排在第i个位置的记录并和第i个元素交换
  for ( int i = 0; i < a.size()-1; ++i)
  {
    Comparable temp = a[i];
    int tempIndex = i;
    for ( int j = i + 1; j < a.size(); ++j )
    {
      if ( a[j] < temp )
      {
        temp = a[j];
        tempIndex = j;
      }
    }
    temp = a[i];
    a[i] = a[tempIndex];
    a[tempIndex] = temp;
  }
}

 二.堆排序

堆的性质:即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
主要步骤:构建初始堆和调堆
技术分享
技术分享
int leftChild ( int i )
{
    return 2 * i + 1;
}

template < typename Comparable >
void adjust ( vector<Comparable> & a, int i, int n )
{//调整由元素i到n构成的堆
    int child;
    Comparable temp;
    
    for ( temp = a[i]; leftChild(i) <= n; i = child)
    { 
        //如果有右孩子,则取两个孩子中的最大值
        child = leftChild ( i );
        if( child != n  && a[ child ] < a[ child + 1] )
            child++;
        if( temp < a[ child ] )
        {//往下移
            a[ i ] = a[ child ];
        }
        else
            break;
    }
    //找到插入位置,进行插入
    a[ i ] = temp;
}
template < typename Comparable >
void heapSort ( vector<Comparable> & a)
{//对下标为0到a.size()-1的元素进行排序
    for ( int i = a.size() / 2 ; i >= 0; i-- )
        adjust(a, i, a.size()-1);
    for ( int j = a.size() - 1; j > 0; j-- )
    {
        Comparable temp = a[j];//交换堆顶和最后一个元素
        a[j] = a[0];
        a[0] = temp;
        adjust(a,0,j-1);//重新调整堆,最后第j个元素用来存储堆顶,
                            //不用再考虑.
    }
}

 

 

 

 

 

选择排序

标签:

原文地址:http://www.cnblogs.com/happygirl-zjj/p/4649061.html

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