更快的快速排序

众所周知,快速算法的速度很大程度上取决于每次所取的比较数, 通常选取第一个待排数作为比较数,为了避免当待排数已基本有序时的排序效率太低,也常常取待排数中的中间数作为比较数。

最理想的快速排序是每次都能取到按大小排名在中间的那个待排数作为比较数。下面我要与大家分享的就是接近于这种状态的一种快速排序算法——用虚拟的绝对中间数来做比较数。经检验效率约提高一倍。

如:要对高考成绩排序,待排数是0-750之间的数。我的算法是:

第一趟用512作为比较数;第二趟用512/2=256 及 (1024+256)/2=768作为比较数;第三趟用256/2=128 , ((256+512)/2=384 及 (512+768)/2=640 作为比较数; 。。。。。。

//C++ 2005

//Introduce you a new type of quick sort

#include "stdafx.h"

# include <iostream> using namespace std;

# include "stdlib.h"

const int size =500; short data[size];

void rdm(); void fqs(short[], int, int, int,int);

int _tmain(int argc, _TCHAR* argv[]) {  rdm(); 

 fqs(data, 0, size-1, 0, 512);

 for(int j=0; j<50; j++)   //show the ordered data  { for(int k=0; k<10; k++)    cout<<data[10*j+k]<<"   ";  cout<<endl;}  return 0; }

void rdm()    /set testing data {  for(int i=0; i<size; i++)   data[i]=rand()/41; }

void fqs(short a[], int left, int right, int lpivot, int pivot)           //fastest quick sort {  register int l, r;  short temp;

 l=left;  r=right;

 while(l<=r)  {   while(l<=right && a[l]<=pivot) l++;   while(r>=left && a[r]>pivot) r--;      if(l<r)   {   temp=a[l];   a[l]=a[r];   a[r]=temp;   l++; r--;   }  }

 if(left<r && pivot>lpivot) fqs(a, left, r, lpivot, (lpivot+pivot)/2);  if(l<right && pivot>lpivot) fqs(a, l, right, pivot, (3*pivot-lpivot)/2); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值