更快的快速排序
来源:互联网 发布:羌在汉藏之间知乎 编辑:程序博客网 时间:2024/04/29 05:21
众所周知,快速算法的速度很大程度上取决于每次所取的比较数, 通常选取第一个待排数作为比较数,为了避免当待排数已基本有序时的排序效率太低,也常常取待排数中的中间数作为比较数。
最理想的快速排序是每次都能取到按大小排名在中间的那个待排数作为比较数。下面我要与大家分享的就是接近于这种状态的一种快速排序算法——用虚拟的绝对中间数来做比较数。经检验效率约提高一倍。
如:要对高考成绩排序,待排数是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);}
- 更快的快速排序
- 比快速排序更快算法
- 比快速排序更快的排序--计数排序及其稳定性
- 怎样让快速排序(quick sort)更快?
- Hadoop之更快的排序
- 快速排序的实现(快排)
- 快速排序 改进快排的方法
- 快速排序 改进快排的方法
- 快速排序 改进快排的方法
- 如何更快的理解简单的排序算法
- 快速排序为什么快?
- 快排 快速排序
- 快速排序为什么快?
- 贪心法设计一种更快的作业排序算法
- 贪心法设计一种更快的作业排序算法
- 更快的学习
- 更快的memcpy
- 更快的AtomicInteger
- Rowid和Rownum的区别
- 加油
- 3000阶乘_大数相乘
- Windows程序设计第二章《Unicode》要点摘要
- 简单Hibernate数据库操作
- 更快的快速排序
- Windows程序设计——第三章《窗口和事件》
- 测试用例设计技术之一-------等价类法
- 经典题目
- Struts 2整合Spring(经典)
- 火曜の休み
- 活着是一种负担
- 为什么要使用Jazz & Jazz 平台体系结构图
- 曾经的摇滚