简单记录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;
}