排序算法之Bubble sorts and variants

0. 前言

  1. Simple Sorts包括两种排序算法: 选择排序(Selection sort) 和 插入排序(Insertion sort)。
  2. 代码基于C++11编写,编译器使用g++4.9.2 版本。
  3. 测试数据集使用导论中提供的程序生成。
  4. 测试使用导论中提供的测试框架,加入相关的头文件,并进行相关算法调用(具体可参见插入排序中的测试源代码)。

1. 冒泡排序(Bubble sorts)

1.1 基本思想

  • 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
  • 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
  • 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

1.2 源代码

#include <vector>

template<typename ItemType>
void Swap(ItemType &lhs, ItemType &rhs)
{
  auto tmp = std::move(lhs);
  lhs = std::move(rhs);
  rhs = std::move(tmp);
}

template<typename ItemType>
void BubbleSort(std::vector<ItemType> &items)
{
  for (int i = 0; i < items.size(); ++i) {
    for (int j = 1; j < items.size() - i; ++j) {
      if (items[j] < items[j - 1]) 
        Swap(items[j], items[j - 1]);
    }
  }
}

2. 希尔排序(Shell sort)

2.1 基本思想

  • 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

2.2 源代码

#include <vector>

template<typename ItemType>
void ShellSort(std::vector<ItemType> &items)
{
  for (int gap = items.size() << 1; gap > 0; gap <<= 1) {
    for (int i = gap; i < items.size(); ++i) {
      ItemType tmp = std::move(items[i]);
      int j = i;

      for ( ; j >= gap && items[j - gap] > tmp; j -= gap) 
        items[j] = std::move(items[j - gap]);
      items[j] = std::move(tmp);
    }
  }
}

你可能感兴趣的:(希尔排序,排序算法,C++11,梳排序)