排序算法

简单记录3个:插入排序、快速排序和归并排序。


1、插入排序(针对数组, 可以控制compare里面的返回值来实现 降序、升序
(data:数组; size:元素个数; esize:每个元素的大小; compare是比较函数)
int issort(void *data, int size, int esize, int(* compare)(const void* key1, const void *key2))
{
char *a = (char*)data;
void *key;
int i,j;

if( (key = (char*)malloc(esize))==NULL )
return -1;
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--;
}
memcpy(&a[(i+1)*esize],key, esize);
}
free(key);

return 0;
}

bool bAsc = true; // true:升序; false:降序;
int bCompare(const void* a, const void* b)
{
// 此比较函数只适用于int类型
if(bAsc)
{
if( *(const int*)a > *(const int*)b)
return 1;
else if( *(const int*)a < *(const int*)b)
return -1;
}
else
{
if( *(const int*)a < *(const int*)b)
return 1;
else if( *(const int*)a > *(const int*)b)
return -1;
}
return 0;
}


2、快速排序
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;
}

static int partition(void* data, int esize, int i, int k, int (*compare)(const void* key1, const void* key2))
{
char *a=(char*)data;
void *pval, *temp;
int r[3];
if( (pval = malloc(esize)) == NULL )
return -1;

if( (temp = malloc(esize)) == NULL )
{
free(pval);
return -1;
}

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);

i--;
k++;

while (1)
{
do
{
k--;
}while(compare(&a[k*esize], pval) >0);

do
{
i++;
}while(compare(&a[i*esize],pval)<0);
if(i>=k)
break;
else
{
memcpy(temp, &a[i*esize], esize);
memcpy(&a[i*esize], &a[k*esize], esize);
memcpy(&a[k*esize], temp, esize);
}
}

free(pval);
free(temp);

return k;
}
// 快速排序函数(data:数组; size:元素个数; esize:单个元素大小; i 初始值为0, k初始值为size-1; compare比较函数)
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 )
return -1;

if(qksort(data,size,esize,i,j,compare) < 0)
return -1;

i = j+1;
}
return 0;
}

// 3、归并排序
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;
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)
{
while(jpos <= k)
{
memcpy(&m[mpos*esize], &a[jpos*esize], esize);
jpos++;
mpos++;
}
continue;
}
else if(jpos > k)
{
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++;
}
}
memcpy(&a[i * esize], m, esize*((k-i)+1));
free(m);
return 0;
}
// 归并排序函数(data:数组; size:元素个数; esize:单个元素大小; i 初始值为0, k初始值为size-1; compare比较函数)---此排序方法需要额外的存储空间
int mgsort(void *data, int size, int esize, int i, int k, int (*compare)(const void* key1, const void* key2))
{
int j;
if(i<k)
{
j = (int)( (i+k-1)/2 );
if(mgsort(data,size,esize,i,j,compare) < 0)
return -1;

if(mgsort(data, size, esize, j+1, k, compare) < 0)
return -1;

if(merge(data, esize, i, j, k, compare) <0)
return -1;
}
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值