冒泡排序、选择排序

来源:互联网 发布:数据集成技术 编辑:程序博客网 时间:2024/04/29 21:20

一、冒泡排序
算法思想:
从左到右扫描数据,找出最大的元素,将其放到数组右边,循环比较相邻的两个数,如果左边的数比右边的大,则交换两个数;

template <typename Type>  void bubbleSort(Type *begin, Type *end)  {      if ((begin == end) || (begin == NULL) || (end == NULL))          return ;      int length = end - begin;      //注意点(1):保证一旦数组有序, 则会直接停止排序, 不会在继续进行无用的循环      bool isOrder = false;      //外层循环控制扫描次数(length-1)      //注意点(2):N个元素其实只需N-1次扫描      for (int i = 0; !isOrder && i < length-1; ++i)      {          //首先假定这次数组已经有序          isOrder = true;          //注意点(3):确保能够从0扫描到最后一个未排序的元素          for (Type *iter = begin; iter < end-i-1; ++iter)          {              //如果前面的左边的元素>右边的元素              if (*iter > *(iter+1))              {                  //交换                  std::swap(*iter, *(iter+1));                  isOrder = false;              }          }      }  }  template <typename Type>  void bubbleSort(Type *array, int length)  {      return bubbleSort(array, array+length);  }  

二、选择排序
思想:从当前尚未排序的序列中选择一个最小的元素,将之放到已排序的序列的队列的末尾;

template <typename Type>  void selectSort(Type *begin, Type *end)  {      if ((begin == end) || (begin == NULL) || (end == NULL))          return ;      //只要循环到最后一个元素的前一个就行了,因为剩下的那个肯定是最大的      for (Type *outer = begin; outer < end-1; ++outer)      {          //注意:是从尚未排序的序列中查找(miner = outer, inner = outer+1)          Type *miner = outer;          //从miner+1开始遍历数组, 寻找一个元素值小于*miner的          for (Type *inner = outer+1; inner < end; ++inner)          {              if (*inner < *miner)                  miner = inner;          }          if (miner != outer)              std::swap(*miner, *outer);      }  }  //为了能够让STL的标准容器如vector使用  template <typename Iterator>  void selectSort(Iterator iter1, Iterator iter2)  {      return selectSort(&(*iter1), &(*iter2));  }  template <typename Type>  void selectSort(Type *array, int length)  {      return selectSort(array, array+length);  
0 0