快速排序(快排)算法的C++两种实现

快排算法在分治的时候有两种实现,一种实现是从两边到中间(partition),另一种实现是从一边到另一边(partition2)。我用一个100000数组测试发现前一种实现运行速度快一些。

这两种的C++实现如下: (注:我用的代码风格是gnu的代码风格)

bool sort::qsort(int *ini, int start, int end)
{ // sort the array ini by ascending order
  int tmp=0;
  int mid=0;

  if (end < start){
    return false;
  }else if(end == start){
    if(ini[start] > ini[end])
      {
	tmp = ini[start];
	ini[start] = ini[end];
	ini[end] = tmp;
      }
    return true;
  }else{			   // when start is less end;
    mid = this->partition2(ini, start, end); 
    // the partition fun. can either be partiton or partiton2.

    if(mid == start && qsort(ini,mid+1,end))
      return true;

    if( mid == end && qsort(ini,start,mid-1))
      return true;

    if(qsort(ini,start,mid-1) && qsort(ini,mid+1,end))
      return true;
    return true;
  }
}

int sort::partition(int *ini, int start, int end)
{   // the main body for partition which from edge to middle
  int key=0;
  int i=start;
  int j=end;
  int tmp = 0;
  key = ini[i];

  while(i!=j)
    {
      while(key <= ini[j] && i < j)
	j--;

      // exchange value, from right to left
      tmp = ini[i];
      ini[i] = ini[j];
      ini[j] = tmp;

      while(key >= ini[i] && i < j)
	i++;

      // exchange value, from left to right
      tmp = ini[i];
      ini[i] = ini[j];
      ini[j] = tmp;
    }

  return i;
}

int sort::partition2(int *ini, int start, int end)
{   // the main body for partition which from end to begin
  int key = ini[end];
  int i = start - 1;		// suppose the mid pos is i+1
  int j=start;
  int tmp = 0;

  for(;j<end;j++)
    {
      if(ini[j] < key )
	{
	  i++;
	  tmp = ini[i];
	  ini[i] = ini[j];
	  ini[j] = tmp;
	}
    }
  ini[end] = ini[i+1];
  ini[i+1] = key;
  return i+1;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值