模拟实现qsort, qsort对多类型数据进行排序


使用回调函数,模拟实现qsort


  • #include <stdio.h>
    
    
    int int_cmp(const void * p1, const void * p2)
    
    
    {
       return (*( int *)p1 > *(int *) p2);
    }
    
    
    void _swap(void *p1, void * p2, int size)
    {
       int i = 0;
       for (i = 0; i< size; i++)
       {
          char tmp = *((char *)p1 + i);
          *(( char *)p1 + i) = *((char *) p2 + i);
          *(( char *)p2 + i) = tmp;
       }
    }
    void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
    {
       int i = 0;
       int j = 0;
       for (i = 0; i< count - 1; i++)
      {
          for (j = 0; j<count-i-1; j++)
             {
                if (cmp ((char *) base + j*size ,
    				(char *)base + (j + 1)*size) >0)
                 {
                    _swap(( char *)base + j*size,
    				(char *)base + (j + 1)*size,size);
                 }
            }
      }
    }
    int main()
    {
        int arr[] = { 1,3,6,2,4,5,8,9,0,7 };
        int i = 0;
        bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
        for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
        {
            printf( "%d ", arr[i]);
        }
        
    	printf("\n");
       return 0;
    }

//对整型数组进行排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int arr[10000],n,i;
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&arr[i]);

qsort(s,n,sizeof(arr[0]),cmp);

for(i=0;i<n;i++) printf("%d ",arr[i]);

return(0);
}

//对double类型数组进行排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int arr[10000],n,i;
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&arr[i]);

qsort(s,n,sizeof(arr[0]),cmp);

for(i=0;i<n;i++) printf("%d ",arr[i]);

return(0);
}

//对字符串数组排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char arr3[10000],i,n;
int cmp(const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}
int main()
{
scanf("%s",arr3);
n=strlen(arr3);
qsort(arr3,n,sizeof(arr3[0]),cmp);

printf("%s",arr3);
return(0);
}

//对结构体进行排序

#include <stdio.h> #include <stdlib.h> struct node { double date1; int no; } arr4[100]; int i,n; int cmp(const void *a,const void *b) { struct node *aa=(node *)a; struct node *bb=(node *)b; return(((aa->date1)>(bb->date1))?1:-1); } int main() { scanf("%d",&n); for(i=0;i<n;i++) { arr4[i].no=i+1; scanf("%lf",&arr4[i].date1); } qsort(arr4,n,sizeof(arr4[0]),cmp); for(i=0;i<n;i++) printf("%d %lf\n",arr4[i].no,arr4[i].date1); return(0); }



//字符串数组排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *arr5[100];
int i,n;
int cmp(const void *a,const void *b)
{
return(strcmp(*(char**)a,*(char**)b));
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
arr5[i]=(char*)malloc(sizeof(char*));
scanf("%s",arr5[i]);
}
qsort(arr5,n,sizeof(arr5[0]),cmp);
for(i=0;i<n;i++) printf("%s\n",arr5[i]);
return(0);
}

编辑器药丸

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值