【mysort】排序函数编写

描述

程序填空题,自己编写排序函数 mysort,使得其能够对任意类型的数组排序

#include <iostream>
using namespace std;
struct A {
	int nouse1;
	int nouse2;
	int n;
};
// 在此处补充你的代码
int MyCompare1( const void * e1,const void * e2)        
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	return * p1 - * p2;
}
int MyCompare2( const void * e1,const void * e2) 
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	if( (* p1 %10) - (* p2 % 10))
		return (* p1 %10) - (* p2 % 10);
	else
		return * p1 - * p2;
}
int MyCompare3( const void * e1,const void * e2) 
{
	A * p1 = (A*) e1;
	A * p2 = (A*) e2;
	return p1->n - p2->n;
}
int a[20];
A b[20];
int main ()
{	
	int n;
	while(cin >> n) {
		for(int i = 0;i < n; ++i) {
			cin >> a[i];
			b[i].n = a[i];
		}
		mysort(a,n,sizeof(int),MyCompare1);
		for(int i = 0;i < n; ++i) 
			cout << a[i] << "," ;           //输出1,整数从小到大
		cout << endl;
		mysort(a,n,sizeof(int),MyCompare2);
		for(int i = 0;i < n; ++i) 
			cout << a[i] << "," ;           //输出2,个位数从小到大
		cout << endl;
		mysort(b,n,sizeof(A),MyCompare3);
		for(int i = 0;i < n; ++i) 
			cout << b[i].n << "," ;         //输出3,整数从小到大
		cout << endl;
	}
	return 0;
}

输入

多组数据。每组数据以整数 n开头(n<10),然后是n个整数

输出

对每组数据,输出三行。
第一行是整数从小到大排序的结果
第二行是按个位数从小到大排序的结果(如果个位数相同,小的排在前面)
第三行还是整数从小到大排序的结果

样例输入

5 21 3 76 48 445
6 73 29 45 8737 2 1

样例输出

3,21,48,76,445,
21,3,445,76,48,
3,21,48,76,445,
1,2,29,45,73,8737,
1,2,73,45,8737,29,
1,2,29,45,73,8737,
int MyCompare1( const void * e1,const void * e2)     //排序规则1,按整数大小排序
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	return * p1 - * p2;                      //返回值大于0,前大后小,交换
}

int MyCompare2( const void * e1,const void * e2)    //排序规则2,按个位数大小排序
{
	int * p1 = (int * ) e1;
	int * p2 = (int * ) e2;
	if( (* p1 %10) - (* p2 % 10))            //两个数的个位数相减的值大于0
		return (* p1 %10) - (* p2 % 10);     //返回值大于0,则p1的个位数大于p2,交换
	else
		return * p1 - * p2;                  //个位数相等,则返回值大于0时,交换(大在后)
}

int MyCompare3( const void * e1,const void * e2)    //排序规则3,按整数大小排序,效果和1相同
{
	A * p1 = (A*) e1;
	A * p2 = (A*) e2;
	return p1->n - p2->n;                    //用结构体实现,实际思路和规则1相同
}
  • mysort(a,n,sizeof(int),MyCompare1);
  • mysort(a,n,sizeof(int),MyCompare2);
  • mysort(b,n,sizeof(A),MyCompare3);

由此可知,mysort函数有4个参数,分别是

  • 待排序数组的起始位置
  • 待排序数组的元素个数n
  • 待排序数组元素的大小sizeof()
  • 待排序数组所使用的排序规则
void mysort(void *a, int n, char len, int f(const void *e1, const void *e2))
{
    for( int i=n-1; i>0; i-- )            //冒泡排序
    {
        for( int j=0; j<i; j++ )
        {
            char * tmp1 = (char*)a + len * j;        //f函数的两个参数,设置为前后两个
            char * tmp2 = (char*)a + len * (j+1);    //char*型,保证所有待比较都会被取到
            if( f(tmp1, tmp2) > 0 )                  //返回值大于0,需要交换
            {
                for( int k=0; k<len; k++ )           //因为不知道一个数组元素的长度,所以循环
                {
                    char tmp = tmp1[k];
                    tmp1[k] = tmp2[k];
                    tmp2[k] = tmp;
                }
            }
        }
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值