使用sqort排序各种类型的数据和模拟sqort实现通用的冒泡排序

#include<stdio.h>
#include<stdlib.h>

typedef struct Books {
    char name[5];
    int num;
}books;

    books b1[10];
int cmp_int(const void* a1, const void* a2)
{
    return *(int*)a1 - *(int*)a2;
}

int cmp_str(const void* a, const void* b)
{
    return *(char*)a - *(char*)b;
}

int cmp_dou(const void* a1, const void* a2)
{
    return *(double*)a1 > *(double*)a2 ? 1 : -1;
}

int cmp_books(const void* a, const void* b)
{
    books* pa1 = (books*)a;
    books* pa2 = (books*)b;
    if (pa1->name != pa2->name)
    {
        return (pa1->name) > (pa2->name) ? 1 : -1;
    }
    else
        return (pa1->num) > (pa2->num) ? 1 : -1;
}

int main()
{
    int arr[5] = { 5,8,9,7,6 };
    char str[] = {'a', 'h', 'e', 'b','x'};
    double arr2[] = { 1.1,5.6,2.3,8.8,6.6 };
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_int);//int型排序
    qsort(str, sizeof(str)/sizeof(str[0]), sizeof(str[0]), cmp_str);//char型排序
    qsort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp_dou);//double型排序
    int i = 0;
    printf("int型排序:\n");
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    printf("char型排序:\n");
    for (i = 0; i < sizeof(str) / sizeof(str[0]); i++)
    {
        printf("%c ", str[i]);
    }
    printf("\n");
    printf("double型排序:\n");
    for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++)
    {
        printf("%.1f ", arr2[i]);
    }

    char arr3[] = {3,4,2,7,1,8,9,12,11,56};
    for (i = 0; i < 10; i++)
    {
        b1[i].num = arr3[i];
    }
    qsort(b1, 10, sizeof(books), cmp_books);
    printf("\n");
    printf("结构体排序:\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d ", b1[i].num);
    }

    return 0;
}

//模拟sqort实现通用的冒泡排序

#include<stdio.h>

int int_cmp(const void* a, const void* b)
{
    return (*(int*)a > *(int*)b);
}

void swap(void* a1, void* a2,int size)
{
    int i = 0;
    for (i = 0; i < size; i++)
    {
        char tmp = *((char*)a1 + i);
        *((char*)a1 + i) = *((char*)a2 + i);
        *((char*)a2 + 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 ((int_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,4,6,8,3,5,7,9 };
    bubble(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),int_cmp);
    int i = 0;
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值