选择排序

一.简单选择排序
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 index = i;
    for ( int j = i + 1; j < a.size(); ++j )
    {
      if ( a[j] < temp )
      {
        temp = a[j];
        index = j;
      }
    }
       if (index!=i)
       {
        temp = a[i];
        a[i] = a[index];
        a[index] = temp;
       }
  }
}    

 

 二.堆排序

堆的性质: 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
主要步骤:构建初始堆和调堆
选择排序_第1张图片
选择排序_第2张图片
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个元素用来存储堆顶,
                            //不用再考虑.
    }
}

 

 

 

 

 

你可能感兴趣的:(选择排序)