使用冒泡排序模仿Qsort函数对不同数据排序

使用冒泡排序作为排序核心,模仿Qsort函数,对不同类型数组进行排序。

默认是对指针数组排序,如果想看其他的数组,在主函数进行修改即可。求长度,输出函数里改成对应数组名,Bubble()函数最后一个参数改成对应比较方法的函数,即可看到你想要的排序结果.

你所不理解的都在注释里面,如果还有些不理解的话,欢迎评论区留言或私信。

#define _CRT_SECURE_NO_WARNINGS

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

int CmpStr(void *p1, void *p2)//字符串比较
{

    return strcmp(*(char **)p1, *(char**)p2);//强转成二级字符指针,这样解一级引用还是指针,这样就可取得4个字节的内容即是取得第数组一个元素的全部地址取得的地址就是整个字符串首元素地址,传入strcm函数进行比较。
}

int CmpNum(void *p1, void *p2)//整型数字比较
{
    int a = *(int*)p1;
    int b = *(int*)p2;
    return a > b ? 1 : a < b ? -1 : 0;
}

int CmpCh(void *p1, void *p2)//字符比较
{

    return *((char*)p1) - *((char*)p2);
}

int CmpFL(void *p1, void *p2)//单精度浮点数字比较
{
    float a = *(float*)p1;
    float b = *(float*)p2;
    return a > b ? 1 : a < b ? -1 : 0;
}


void Swap(void *p1, void *p2, int size)
{
    char tmp;
    int i = 0;
    while (i < size)//将变量的每一字节进行交换
    {
        tmp = *(char *)p1;
        *(char *)p1 = *(char *)p2;
        *(char *)p2 = tmp;
        ((char *)p1)++;
        ((char *)p2)++;
        i++;
    }

}


void Bubble(void *ptr, int ele_num, int type_len, int(*cmp)(void *, void *))//void*型指针保证类型的兼容性,传入什么类型都可以进行排序在内部,将指针转成char*类型,是的每一字节进行交换,使得不必考虑虑参数类型
{
    int i = 0;
    int j = 0;
    int flag = 0;//有序标记

    for (i = 0; i < ele_num - 1; i++)
    {
        flag = 0;
        for (j = 0; j < ele_num - 1 - i; j++)
        {//针对指针数组来说,存放的地址转换成用char*类型指针读取,读取只读取1个字节的内容,第二个参数加类型长度,指向数组下一个元素地址,也只读取一个字节内容
            if (cmp((char *)ptr + j * type_len, (char *)ptr + (j + 1) * type_len) > 0)
            {//同理Swap函数,针对指针数组来说,转成char类型指针,交换的是一个字节的内容,并没有一次性交换4字节(整个字符串首元素)的地址
                Swap((char *)ptr + j * type_len, (char *)ptr + (j + 1) * type_len, type_len);
                flag = 1;//进行一次排序,flag置为1,表示该序列本身不是有序的
            }
        }
        if (0 == flag)//第一次循环,没有进行一次交换,表示序列本身就是有序的 
        {
            return;
        }
    }

}

int main()
{
    char *p[] = { "gabc","zbcd", "iyryr", "qeqw","nmczn","popop" };//记住,这是一个指针数组,是一个存放指针的数组,而不是指针
    //int num[] = { 123,567,890,2342,6466 };
    //char ch[] = { 'b','g','p','a','u' };
    //float fL[] = { 7.4f,7.6f,9.4f,3.2f,1.1f };//若不加f会报double到float截断,因为系统默认是double型


    int i = 0;
    int length = sizeof(p) / sizeof(p[0]);


    Bubble(p, length, sizeof(char*), CmpStr);//字符串数组排序
    //Bubble(num, length, sizeof(int), CmpNum);//整型数字排序
    //Bubble(ch, length, sizeof(char), CmpCh);//字符排序
    //Bubble(fL, length, sizeof(float), CmpFL);//单精度浮点数排序

    while (i<length)
    {
        printf("%s\n", p[i]);
        i++;
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值