描述
程序填空题,自己编写排序函数 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;
}
}
}
}
}