#include <iostream>
#include <stdlib.h> using namespace std;
int compared(const void *key1,const void *key2)
{
//cout<<"enter compare"<<endl;
const int* iKey1 = (int*)key1;
const int* iKey2 = (int*)key2;
//cout<<*iKey1<<endl;
//cout<<*iKey2<<endl; if(*iKey1>*iKey2){
//cout<<"big"<<endl;
return 1;
}
else if(*iKey1==*iKey2){
//cout<<"equal"<<endl;
return 0;
}
else if(*iKey1<*iKey2)
{
//cout<<"less"<<endl;
return -1;
}
} //k设置为size-1
//i设置为0
//j设置为中间数
static int merge(void* data, int esize, int i, int j, int k, int (*compare)
(const void* key1,const void* key2))
{
char *a = (char*)data, *m=NULL;
int ipos, jpos, mpos; ipos = i;
jpos = j+1;
mpos = 0; if((m=(char*)malloc(esize*((k-i)+1)))==NULL )
{
return -1;
} while(ipos<=j||jpos<=k)
{
if(ipos>j)
{
//the left elements has no more elements to merge
while(jpos<=k)
{
memcpy(&m[mpos*esize],&a[jpos*esize],esize);
jpos++;
mpos++;
}
continue;
}
else if(jpos>k)
{
//right division has no more elements to merge.
while(ipos<=j)
{
memcpy(&m[mpos*esize],&a[ipos*esize],esize);
ipos++;
mpos++;
}
continue;
}
if(compare(&a[ipos*esize],&a[jpos*esize])<0)
{
memcpy(&m[mpos*esize],&a[ipos*esize],esize);
ipos++;
mpos++;
}
else
{
memcpy(&m[mpos*esize],&a[jpos*esize],esize);
jpos++;
mpos++;
}
}
//prepare to merge data
memcpy(&a[i*esize], m,esize*((k-1)+1)); free(m); return 0; } int mgsort(void *data, int size, int esize, int i,int k,int (*compare)
(const void* key1,const void* key2))
{
int j;
//stop the recursion when no more element divisions can be made.
if(i<k)
{
//determine where to divide the elements
j = (int)(((i+k-1))/2); if(mgsort(data,size,esize,i,j,compared)<0)
{
return -1;
}
if(mgsort(data,size,esize,j+1,k,compared)<0)
{
return -1;
}
//merge the two sorted divisions into a single sorted set
if(merge(data,esize,i,j,k,compared)<0)
{
return -1;
}
}
return 0;
} int main(int argc, char *argv[])
{
int a[]={4,2,5,8,4,6}; for(int i=0;i<6;i++)
{
cout<<a[i]<<",";
}
cout<<endl; mgsort(a,6,4,0,5,compared); for(int i=0;i<6;i++)
{
cout<<a[i]<<",";
}
cout<<endl;
system("PAUSE");
return 0;
}

C++_归并排序(纯C版)的更多相关文章

  1. javascript日历控件——纯javascript版

    平时只有下班时间能code,闲来写了个纯javascript版.引用该calendar.js文件,然后给要设置成日历控件的input的id设置成calendar,该input就会变成日历控件. < ...

  2. python练习_购物车(简版)

    python练习_购物车(简版) 需求: 写一个python购物车可以输入用户初始化金额 可以打印商品,且用户输入编号,即可购买商品 购物时计算用户余额,是否可以购买物品 退出结算时打印购物小票 以下 ...

  3. Android x86 下运行纯ARM版APP

    Android x86 默认不带houdini,运行纯ARM版会提示: 很抱歉,”xxxx”已停止运行 设置->应用兼容性->打开 终端模拟器 $ su# enable_nativebri ...

  4. Java八股文纯享版——篇①:Java基础

    注: 1.笔记为个人归纳整理,尽力保证准确性,如有错误,恳请指正 2.写文不易,转载请注明出处 3.本文首发地址 https://blog.leapmie.com/archives/b8fe0da9/ ...

  5. Java八股文纯享版——篇②:并发编程

    注: 1.笔记为个人归纳整理,尽力保证准确性,如有错误,恳请指正 2.写文不易,转载请注明出处 3.本文首发地址 https://blog.leapmie.com/archives/c02a6ed1/ ...

  6. C++_直接插入排序(纯C版)

    //用于比较大小 int compared(const void *key1,const void *key2) { cout<<"enter compare"< ...

  7. 21. Bypass D盾_防火墙(旧版 and 新版)SQL注入防御(多姿势)

    D盾旧版: 00前言 D盾_IIS防火墙,目前只支持Win2003服务器,前阵子看见官方博客说D盾新版将近期推出,相信功能会更强大,这边分享一下之前的SQL注入防御的测试情况.D盾_IIS防火墙注入防 ...

  8. 画线动画——SVG版和纯CSS版

    概述 我们常常在网站中看到一些画线的动画效果,非常炫酷,大多数这种画线动画效果是通过SVG实现的,也有不少是用纯css实现的,下面我总结了一下这2种方法,供以后开发时参考,相信对其他人也有用. 参考资 ...

  9. 数据库_存储过程简介(oracle版)

    应朋友要求,写个存储过程说明,本篇比较简单,适合新接触存储过程的同学 先来个简单的 begin dbms_output.put_line('my first execute'); end; 如果使用的 ...

随机推荐

  1. 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...

  2. schema对象介绍

    1.schema对象简介 数据库schema为一组数据结构的逻辑集合,称之为schema对象,schema对象最贱的为表和索引,schema对象由SQL创建和维护. 一个数据库用户拥有一个用户名和各种 ...

  3. 关于FireFox下 CSS3 transition 与其他浏览器的差异

    最近一个项目,动画效果全靠CSS3来做,用得比较多的transition,发现了一点火狐与其他浏览器的小差异. 首先我们写CSS的时候,一般为属性值为0的属性,我们一般会这样写 #id{ posito ...

  4. Developer Tools(开发工具)

    Google提供了使用Java和Python开发App Engine的免费工具.你可以从Google的网站上下载你所用语言和操作系统的软件开发包.Java用户可以以Eclipse集成开发环境的方式获取 ...

  5. ubuntu openstack packaages

  6. Hellow world!

    其实一年前开始就有了些许开篇技术博客的想法,一直觉得写这些的人都一定好牛×.现刚毕业,我也是时候朝牛×之路迈进了.当然,我才刚入门不久,前路漫漫,需一步一脚印,先打算把平常遇到的一些问题与关注的东西都 ...

  7. poj 1679 http://poj.org/problem?id=1679

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  8. 关于block以及__bridge的一些笔记

    问题概要 _block是否是一个OC对象? __bridge相关. _block是否是一个OC对象? 结论 一般来说,block可以看做一个OC对象,但是在编译器底层,block又可以被细分为bloc ...

  9. hashCode()和equals()的用法

    使用hashCode()和equals() hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. hashCode()方法 ...

  10. 在VB中使用Linq To SQLite注意事项

    昨天使Linq To SQLite 支持VB,今天在VB中写了几条Linq语句,发现了几个问题: 1.在Linq To SQLite中的Linq语句查询后并不是得到的匿名数据类,而是将Linq转换为S ...