C语言——库函数qsort的使用和模拟实现

简介: C语言——库函数qsort的使用和模拟实现

文章目录

1.qsort函数的介绍

2.qsort实现不同类型数据排序

3.qsort的模拟实现

1.qsort函数的介绍

void* base

size_t num

size_t width

int (compar)(const void,const void*)

2.qsort实现不同类型数据排序

define _CRT_SECURE_NO_WARNINGS

include<stdio.h>

include<stdlib.h>

include<string.h>

int cmp_int(const void e1, const void e2)
{

return (*(int*)e1 - *(int*)e2);

}
void test1()
{

int arr[] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
    printf("%d ", arr[i]);
}

}

struct Stu
{

char name[20];
int age;

};

int cmp_stu_by_name(const void e1, const e2)
{

return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);

}

void test2()
{

struct Stu s[] = { {"zhangsan",20},{"lisi",21},"wangwu",19};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
int i = 0;
for (i = 0; i < 3; i++)
{
    printf("%s %d ", s[i].name, s[i].age);
}

}

int main()
{

test1();
prinf("\n");
test2();
return 0;

}

int main()
{

int a = 10;
char* pa = &a;
return 0;

}

3.qsort的模拟实现

//交换
void Swap(char buf1, char buf2, int width)
{

int i = 0;
for (i = 0; i < width; i++)
{
    char tmp = *buf1;
    *buf1 = *buf2;
    *buf2 = tmp;
    buf1++;
    buf2++;
}

}

void bubble_sort(void base, int sz, int width, int(cmp)(const void e1, const void e2))
{

int i = 0;
for (i = 0; i < sz - 1; i++)
{
    //一趟排序
    int flag = 1;
    int j = 0;
    for (j = 0; j < sz - 1; j++)
    {
        if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
        {
            Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
            flag = 0;
        }
    }
    if (flag == 1)
        break;
}

}
int cmp_int(const void e1, const void e2)
{

return (*(int*)e1 - *(int*)e2);

}

void test1()
{

int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
    printf("%d ", arr[i]);
}

}

struct Stu
{

char name[20];
int age;

};

int cmp_stu_by_name(const void e1, const e2)
{

return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);

}

void test2()
{

struct Stu s[] = { {"zhangsan",20},{"lisi",21},"wangwu",19};
int sz = sizeof(s) / sizeof(s[0]);
 bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
int i = 0;
for (i = 0; i < 3; i++)
{
    printf("%s %d ", s[i].name, s[i].age);
}

}
int main()
{

test1();
printf("\n");
test2();

return 0;

}

相关文章
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
|
5天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
ly~
|
10天前
|
数据可视化 BI API
除了 OpenGL,还有哪些常用的图形库可以在 C 语言中使用?
除了OpenGL,C语言中还有多个常用的图形库:SDL,适合初学者,用于2D游戏和多媒体应用;Allegro,高性能,支持2D/3D图形,广泛应用于游戏开发;Cairo,矢量图形库,支持高质量图形输出,适用于数据可视化;SFML,提供简单接口,用于2D/3D游戏及多媒体应用;GTK+,开源窗口工具包,用于创建图形用户界面。这些库各有特色,适用于不同的开发需求。
ly~
23 4
|
11天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
27 2
|
13天前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
16 3
|
10天前
|
C语言
C语言函数
C语言函数
10 0
|
11天前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
11天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
34 0
|
11天前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
29 0