//比较大小

static int compare_int(const void *int1,const void *int2)
{
if(*(const int*)int1>*(const int*)int2)
{
return 1;
}
else if(*(const int*)int1<*(const int*)int2)
{
return -1;
}
else
{
return 0;
}
}

//随机生成三个数,找出中间数的直接插入排序

int issort(void *data, int size,int esize,int (*compare)(const void *key1,const void *key2))
{
char *a = (char*)data; void *key=NULL; int i=0,j=0; if((key=(char *)malloc(esize))==NULL)
{
return -1;
}
else
{
memset(key, 0, esize);
for(j=1;j<size;j++)
{
memcpy(key, &a[j*esize],esize);
i=j-1; while(i>=0&&compare(&a[i*esize],key)>0){
memcpy(&a[(i+1)*esize],&a[i*esize],esize);
i--;
cout<<i<<endl;
} memcpy(&a[(i+1)*esize],key,esize); }
free(key);
return 0;
} }

//与当前pval相比,小的放左边,大的放右边,pval即r[1]

static int partition(void *data, int esize, int i, int k, int (*compare)(const void *key1,const void *key2))
{
//cout<<"enter partition"<<endl;
char *a=(char*)data; void *pval=NULL, *temp=NULL; int r[3]={0,0,0}; //allocate storage for the partition value and swap
if((pval = malloc(esize))==NULL)
{
return -1;
}
if((temp = malloc(esize))==NULL)
{
free(pval);
return -1;
} //Use the median-of-tree method to find the partition value
r[0] = (rand() % (k-i+1))+i;
r[1] = (rand() % (k-i+1))+i;
r[2] = (rand() % (k-i+1))+i; issort(r, 3, sizeof(int), compare_int); memcpy(pval, &a[r[1]*esize],esize); //cout<<"*pval= "<<(pval)<<endl;
//create two partitions around the partition value i--;
k++;
// cout<<"this is i: "<<i<<endl;
// cout<<"this is k: "<<k<<endl; while(1)
{ do{
// cout<<"doing k"<<endl;
k--;
}while(compare(&a[k*esize],pval)>0); do{
// cout<<"doing i"<<endl;
i++;
}while(compare(&a[i*esize],pval)<0); if(i >= k)
{
// cout<<"doing break"<<endl;
break;
}
else
{
// cout<<"swaping......................."<<endl;
memcpy(temp, &a[i*esize], esize);
memcpy(&a[i*esize], &a[k*esize], esize);
memcpy(&a[k*esize], temp, esize);
}
} free(pval);
free(temp);
// cout<<"left partition"<<endl; return k;
}

//排序调用

int qksort(void *data, int size, int esize, int i, int k, int (*compare)(const void *key1,const void *key2))
{
int j;
while(i<k)
{
if((j=partition(data,esize,i,k,compare))<0)
{
//cout<<"return partition"<<endl;
return -1;
} if(qksort(data,size,esize,i,j,compare)<0)
{
//cout<<"return qksort"<<endl;
return -1;
} else
{
i=j+1;
//cout<<"i value: "<<i<<endl;
//cout<<"j value: "<<j<<endl;
}
} return 0;
}

C++_快速排序(纯C版本)的更多相关文章

  1. 纯MATLAB版本 SIFT代码

    先贴几个链接: http://blog.csdn.net/abcjennifer/article/details/7639681  Rachel-Zhang的 http://blog.csdn.net ...

  2. Python笔记_第五篇_Python数据分析基础教程_相关安装和版本查看

    1. IDE说明: 所有的案例用Anacoda中的Jupiter工具进行交互式讲解. 2. 版本和安装: NumPy从如下网站安装:http://sourceforge.net/projects/nu ...

  3. 瓦片切图工具gdal2tiles.py改写为纯c++版本

    gdal2tiles.py是GDAL库中用于生成TMS瓦片的python代码,支持谷歌墨卡托EPSG:3857与经纬度EPSG:4326两种瓦片,输出png格式图像. gdal2tiles.py Mo ...

  4. bug_ _小心android-support-v4.jar版本混乱造成的NoClassDefFoundError

    当你的项目出现以下红色提示的时候,要小心了, 因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the de ...

  5. 快速排序(js版本)

    快速排序的时间复杂度为:O(n*log2n),相比较其他O(n2)的排序算法,还是比较有优势的.原文参考在此处,因为本人对原文的一小段代码有点不理解,所以进行了小的修改. 1.基本思想:在数组的第一个 ...

  6. js实现的文章输入检查与测速。(纯js版本)

    朋友又提出一些需求.希望不要jquery .于是修改成js版本. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

  8. Struts2-Ajax整合之纯JavaScript版本

    1.Ajax的作用:能够在不重新加载页面的情况下,用异步的方式与后台服务器进行数据交互 2.Struts2-Json的jar包(包含阿里巴巴自己的jar包) commons-beanutils-1.7 ...

  9. linux 平台实现 web 服务器的自动化发布 (纯shell 版本,存在ssh 不能自动退出问题,待解决)

    转至:https://www.cnblogs.com/vmsky/p/13824172.html 背景说明 1.集团OA系统上线,web App 部署在6台服务器中,因项目初期,每次更新都需要进行大量 ...

随机推荐

  1. ASP.NET常用技巧方法代码断

    1. 打开新的窗口并传送参数:传送参数:response.write("<script>window.open('*.aspx?id="+this.DropDownLi ...

  2. javascript AES加密 C#AES解密实现

    首先需要引入js类库 crypto-js(开源),地址:http://code.google.com/p/crypto-js 现在很多人无法打开这个地址不要紧,下面我们会将全部代码贴出来 需要引入 a ...

  3. 在Lua里写unity游戏笔记

    gameobject.GetComponent<Transform>(); 翻译成Lua: gameObject:GetComponent (luanet.ctype (Transform ...

  4. dbms_file_transfer使用简介

    dbms_file_transfer这个包可以在两个位置传输文件,分别可以有以下位置: a 从一个asm diskgroup传输到另外一个asm diskgroup b 从一个asm diskgrou ...

  5. 第二百九十五天 how can i 坚持

    买了个小米电话卡,写的让周六日送,非得今天给送来,浪费了1块钱.买回来还没法激活,这.. 昨天差点挂掉,今天感觉好多了,不过今天好冷,回来快冻死了. 今天啊,年终奖订下来了,没有想象的高 啊,有点小失 ...

  6. 第二百四十四、五天 how can I 坚持

    昨天忘了.不知咋忘的,加班加迷糊了? 昨天联调接口,又加班了,好歹基本调通了. 今天,下午,开会,有点被领导批的意思,不是批我,是批我们团队. 团队. 不懂自己. 这样做有意义嘛. 睡觉.好烦. 到底 ...

  7. jQuery基础学习5——JavaScript方法获取页面中的元素

    给网页中的所有<p>元素添加onclick事件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  8. 山东理工大学ACM平台题答案关于C语言 1137 C/C++经典程序训练7---求某个范围内的所有素数

    C/C++经典程序训练7---求某个范围内的所有素数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 求小于n的所有素数,按照每行 ...

  9. ASP.NET forms凭据设置和跳转的几种方法

    string user = "userName"; //默认的第1种,超时时间是在web.cofig中forms设置的timeout,单位是分钟,生成的cookie和凭证超时时间一 ...

  10. Mac使用指南

    1.csrutil命令 简单来说 是苹果在新系统后加入的一个安全机制. Rootless讨论的前提是假定root账户是OS X(或者其他Unix系统)中对抗恶意程序保护操作系统的最后一道防线.意思是一 ...