复习数据结构和算法01-常用的排序算法

复习数据结构和算法

namespace Sort{

 template<typename _DataType>
 void Swap(_DataType &l, _DataType &r)
 {
  _DataType temp(l);
  l = r;
  r = temp;
 }

 //冒泡排序 升序
 //O(n^2)
 template<typename _DataType>
 void BubbleSort(_DataType data[], int nCount)
 {
  if(nCount<2)
   return;
  int i, j;
  for(i=1; i<nCount-1; i++)
   for(j=0; j<nCount-i; j++)
   {
    if(data[j+1]<data[j])
     Swap(data[j], data[j+1]);
   }
 }

 //及时终止的冒泡排序 升序
 //最好情况 有序 O(n)
 //最坏情况 无序 O(n^2)
 template<typename _DataType>
 void BubbleSort2(_DataType data[], int nCount)
 {
  if(nCount<2)
   return;
  int i, j;
  bool bOK;
  for(i=1; i<nCount-1; i++)
  {
   bOK = true;
   for(j=0; j<nCount-i; j++)
   {
    if(data[j+1]<data[j])
    {
     bOK = false;    
     Swap(data[j], data[j+1]);
    }
   }
   if(bOK)
    break;
  }  
 }

 //选择排序 升序
 template<typename _DataType>
 void SelectionSort(_DataType data[], int nCount)
 {
  if(nCount<2)
   return;
  int i, j, idxMax;
  for(i=0; i<nCount-1; i++)
  {
   idxMax = 0;
   for(j=1; j<nCount-i; j++)
   {
    if(data[idxMax]<data[j])
     idxMax = j;
   }
   Swap(data[idxMax], data[j-1]);
  }
 }

 //插入排序
 //最好情况 数组有序 O(n-1)
 //最坏情况 数组逆序 O(n^2)
 template<typename _DataType>
 void InsertionSort(_DataType data[], int nCount)
 {
  if(nCount<2)
   return;
  int i, j;
  _DataType temp;
  for(i=1; i<nCount; i++)
  {
   temp = data[i];
   for(j=i-1; j>=0 && temp<data[j]; j--)
    data[j+1] = data[j];
   data[j+1] = temp;
  }
 }

 //希尔(Shell)排序   约为n^1.3
 template<typename _DataType>
 void ShellSort(_DataType data[], int nCount)
 {
  if(nCount<2)
   return;
  int i, j;
  int stride = nCount>>1;
  _DataType temp;
  while(stride)
  {
   for(i=0; i<nCount; i+=stride)
   {
    temp = data[i];
    for(j=i-stride; j>=0 && temp<data[j]; j-=stride)
     data[j+stride] = data[j];
    data[j+stride] = temp;
   }
   stride = stride>>1;
  }
  
 }

 //快速排序 data[begin]~data[end](包括data[begin]与data[end])
 //平均时间复杂度 O(nlogn)
 //最坏情况: O(n^2)         完全有序
 //最好情况: 前后段元素个数基本相等, 支点取值接近中值
 template<typename _DataType>
 void _quicksort(_DataType data[], int begin, int end)
 {
  if(begin>=end)
   return;
  int left=begin, right=end+1;
  _DataType pivot(data[begin]);  //
  while(1)
  {
   //左侧找出一个比支点大的值
   do{
    ++left;
   }while(left<=end && data[left]<pivot);
   //右侧找出一个比支点小的值
   do{
    --right;
   }while(begin<=right && data[right]>pivot);

   //交换完毕 跳出循环
   if(left>=right)
    break;
   //交换两侧查找到的值
   Swap(data[left], data[right]);
  }
  
  data[begin] = data[right];
  data[right] = pivot;
  //递归:排序前半段
  _quicksort(data, begin, left-1);
  //递归:排序后半段
  _quicksort(data, right+1, end);
 }

 //快速排序封装函数
 template<typename _DataType>
 void QuickSort(_DataType data[], int nCount)
 {
  if(nCount<2 || NULL==data)
   return;
  _quicksort(data, 0, nCount-1);
 }

}; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值