ソートバブルソート(バブルソート)、マージソート(並べ替えマージ)

ソートバブルソート(バブルソート)、マージソート(並べ替えマージ)

1、バブルソート(バブルソート)、基本的に3つのアルゴリズムが存在します

  • 基本的なバージョン、フルスキャン。
  • 早期終了のバージョン、交換がエリア内に行われなかった前に、それが発見された場合、それはフロントエリアが整然としている示し、直接終了。しかし、非効率的な場所は、ハイテク、各サイクルは、ユニットが前方に移動している右側の境界がされています
  • 低右端ハイテク携帯効率を解決するために、早期終了のバージョンに基づいて、バージョンをジャンプ。溶液:各サイクル、最後に記録された位置Aを交換し、その後HIせ=位置Aを切り替えた後、ジャンプがhi複数のユニットを移動させることができます。

基本的なコードの実装

//冒泡排序(基本版 效率低下)
template<typename T>
void Vector<T>::bubbleSortA(Rank lo, Rank hi){
  while(lo < hi - 1){
    for(int i = lo; i < hi - 1; ++i){
      if(_elem[i] > _elem[i+1]){
        std::swap(_elem[i], _elem[i+1]);
      }
    }
    hi--;//头不变,不断收缩尾部
  }
}

早期終了バージョンのコードを実装

//冒泡排序(提前终止版 效率比基础版高)
template<typename T>
void Vector<T>::bubbleSortB(Rank lo, Rank hi){
  while(!bubbleB(lo, hi--));
}
template<typename T>
bool Vector<T>::bubbleB(Rank lo, Rank hi){
  bool sorted = true;//假设整体有序
  for(int i = lo; i < hi - 1; ++i){
    if(_elem[i] > _elem[i+1]){
      sorted = false;
      std::swap(_elem[i], _elem[i+1]);
    }
  }
  return sorted;
}

バージョンコードの実装をスキップ

//冒泡排序(跳跃版,跳跃移动边界hi 效率最高)
template<typename T>
void Vector<T>::bubbleSortC(Rank lo, Rank hi){
  do{
    hi = bubbleC(lo, hi);
  }while(lo < hi);
}
template<typename T>
Rank Vector<T>::bubbleC(Rank lo, Rank hi){
  Rank last = lo;
  for(int i = lo; i < hi - 1; ++i){
    if(_elem[i] > _elem[i+1]){
      last = i + 1;
      std::swap(_elem[i], _elem[i+1]);
    }
  }
  return last;
}

図2に示すように、マージソート(並べ替えマージ)

再帰の使用中の知識を持つ削減戦略。アレイは、2分割され、その後ソートされ、最終的に混合しました。

template <typename T> //向量归并排序
void Vector<T>::mergeSort ( Rank lo, Rank hi ) { //0 <= lo < hi <= size
  if ( hi - lo < 2 ) return; //单元素区间自然有序,否则...
  int mi = ( lo + hi ) / 2; //以中点为界
  mergeSort ( lo, mi ); //分别排序
  mergeSort ( mi, hi ); //分别排序
  merge ( lo, mi, hi ); //归并
}
template <typename T> //有序向量(区间)的归并
void Vector<T>::merge ( Rank lo, Rank mi, Rank hi ){ //各自有序的子向量[lo, mi)和[mi, hi)
  T* A = _elem + lo; //合并后的向量A[0, hi - lo) = _elem[lo, hi)
  int lb = mi - lo; T* B = new T[lb]; //前子向量B[0, lb) = _elem[lo, mi)
  for ( Rank i = 0; i < lb; i++ ) B[i] = A[i]; //复制前子向量
  int lc = hi - mi; T* C = _elem + mi; //后子向量C[0, lc) = _elem[mi, hi)
  for ( Rank i = 0, j = 0, k = 0; j < lb; ) //归并:反复从B和C首元素中取出更小者
    A[i++] = ( lc <= k || B[j] <= C[k] ) ? B[j++] : C[k++]; //将其归入A中
  delete [] B; //释放临时空间B
}

3 2つのソートアルゴリズムの比較

高効率の並べ替えをマージ

C / C ++相互学習のQQグループ:877 684 253

Iマイクロ手紙:xiaoshitou5854

おすすめ

転載: www.cnblogs.com/xiaoshiwang/p/11684107.html