众所周知,快速算法的速度很大程度上取决于每次所取的比较数, 通常选取第一个待排数作为比较数,为了避免当待排数已基本有序时的排序效率太低,也常常取待排数中的中间数作为比较数。
最理想的快速排序是每次都能取到按大小排名在中间的那个待排数作为比较数。下面我要与大家分享的就是接近于这种状态的一种快速排序算法——用虚拟的绝对中间数来做比较数。经检验效率约提高一倍。
如:要对高考成绩排序,待排数是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); }