C快排qsort()【char *arr[10]、char arr[10][10]、char arr[10]、struct型】、(char *)malloc(sizeof(char*))、sizeof

编程入门 行业动态 更新时间:2024-10-14 22:20:23

C快排qsort()【char *<a href=https://www.elefans.com/category/jswz/34/1570031.html style=arr[10]、char arr[10][10]、char arr[10]、struct型】、(char *)malloc(sizeof(char*))、sizeof"/>

C快排qsort()【char *arr[10]、char arr[10][10]、char arr[10]、struct型】、(char *)malloc(sizeof(char*))、sizeof

目录

  • 一、qsort() 介绍
    • 1.1 字符串数组的排序:char *s[]型
      • 1.1.1 (char *)malloc(sizeof(char) * len) 强制转换为8个字节(64位系统))
      • 1.1.2 sizeof() 用法
    • 1.2 字符串数组的排序:char s[][]型
    • 1.3 struct型
    • 1.4 int型数组
    • 1.4 char型数组
    • 1.5 double型数组


C----qsort 排序
C----qsort 排序

一、qsort() 介绍

qsort() 就是C语言中的快排函数,包含在 stdlib.h头文件中;

函数一共有四个参数,没有返回值。

int cmp(const void *a, const void *b) {// 代码体
}qsort(arr, n, sizeof(arr[0]), cmp);

1、第一个参数 s 是一个地址,即参与排序的首地址
2、n 是需要排序的数量;
3、sizeof(s[0]) 则是每一个元素占用的空间大小
4、指向函数的指针,用于确定排序的顺序。


1.1 字符串数组的排序:char *s[]型

C代码1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{// return (strcmp(*(char **)a, *(char **)b));return (strcmp((char *)a, (char *)b));  // 效果一致
}void change1(char *a)
{printf("%p\n", a);a[0] = 'y';
}void change2(char **a)  // 要求入参必须传 "指针的地址" &s[0]、&arr,不然编译器报错
{printf("%p\n", a);printf("%p\n", *a);(*a)[0] = 'z';
}int main()
{char str1[] = "java";char str2[] = "python";char str3[] = "ssdsfbdbd";char **s;s = (char **)malloc(sizeof(char *) * 2);s[0] = (char *)malloc(sizeof(char *));s[0] = str1;s[1] = (char *)malloc(sizeof(char *));s[1] = str2;change1(s[0]);change2(&s[0]);  // qsort(s, 2, sizeof(s[0]), cmp);for (int i = 0; i < 2; i++) {printf("%s\n", s[i]);}return 0;
}
000000000061FDFB
0000000000181570
000000000061FDFB
python
zava

————
C代码2:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{// return (strcmp(*(char **)a, *(char **)b));return (strcmp((char *)a, (char *)b));  // 一致
}int main()
{char *arr[100];   // 此处已经开辟了 100个空间内存int i, n;scanf("%d", &n);for (i = 0; i < n; i++) {arr[i] = (char *)malloc(sizeof(char *));  // 不应该是 arr[i] = (char *)malloc(sizeof(char) * len)吗?scanf("%s", arr[i]);}qsort(arr, n, sizeof(arr[0]), cmp);for (i = 0; i < n; i++) {printf("%s\n", arr[i]);}return 0;
}


1.1.1 (char *)malloc(sizeof(char) * len) 强制转换为8个字节(64位系统))

char *arr[5];arr[0] = (char *)malloc(sizeof(char) * 1);  
printf("%d\n", sizeof(arr[0]));  // 8arr[1] = (char *)malloc(sizeof(char) * 10);
printf("%d\n", sizeof(arr[1]));  // 8arr[2] = (char *)malloc(sizeof(char) * 100);
printf("%d\n", sizeof(arr[2]));  // 8arr[3] = (char *)malloc(sizeof(char) * 1000);
printf("%d\n", sizeof(arr[3]));  // 8arr[4] = (char *)malloc(0);   // (char *) 会强制转换为 char* 的内存大小(8个字节)
printf("%d\n", sizeof(arr[4]));  // 8

1.1.2 sizeof() 用法

int arr2[10];
char arr3[10]= "c";
char *arr[10];  // 指针数组(存放指针的数组)
char *p = "hello";
int *arr4;
printf("%d\n", sizeof(arr2));    // 40个字节:一个int类型占4个字节(32位)(32/64位系统)
printf("%d\n", sizeof(arr3));    // 10个字节:一个字符占1个字节          (32/64位系统)
printf("%d\n", sizeof(arr));     // 80个字节:一个char* 指针占8个字节(64位)(32:4、64:8)
printf("%d\n", sizeof(char));    // 1个字节(8 bit)
printf("%d\n", sizeof(char*));   // 8个字节
printf("%d\n", sizeof(p));       // 8个字节
printf("%d\n", sizeof(arr4));    // 8个字节arr4 = arr2;  // arr4 就是一个地址了
printf("%d\n", sizeof(arr4));    // 8个字节// 【指针变量】的所占空间大小仅仅和操作系统位数有关32-4,64-8

printf("%d\n", sizeof(unsigned short));  // 2字节
printf("%d\n", sizeof(signed short));    // 2字节printf("%d\n", sizeof(unsigned char));   // 1字节
printf("%d\n", sizeof(signed char));     // 1字节printf("%d\n", sizeof(unsigned int));   // 4字节
printf("%d\n", sizeof(signed int));     // 4字节printf("%d\n", sizeof(unsigned long));   // 4字节
printf("%d\n", sizeof(signed long));     // 4字节printf("%d\n", sizeof(unsigned long long));   // 8字节
printf("%d\n", sizeof(signed long long));     // 8字节printf("%d\n", sizeof(float));           // 4字节
printf("%d\n", sizeof(double));          // 8字节

C语言中的sizeof()和strlen()的区别


1.2 字符串数组的排序:char s[][]型

C代码1:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{return (strcmp((char *)a, (char *)b));  // strcmp接收地址
}int main()
{char s[100][100];  // 内存均已申请int i, n;scanf("%d", &n);for (i = 0; i < n; i++) {printf("s[i] len = %d\n", strlen(s[i]));scanf("%s", s[i]);   // 此时不用再申请字符串的长度内存了,已申请长度100的字符串内存大小printf("s[i] len1 = %d\n", strlen(s[i]));}qsort(s, n, sizeof(s[0]), cmp);for (i = 0; i < n; i++) {printf("%s\n", s[i]);}return 0;
}

测试代码:

s[i] len = 0
fsfs
s[i] len1 = 4
s[i] len = 0
wfefefg
s[i] len1 = 7
s[i] len = 0
hrhr
s[i] len1 = 4
fsfs
hrhr
wfefefg

————
C代码2:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{return (strcmp((char *)a, (char *)b));
}int main()
{/*1、创建了5个长度为10的一维数组2、一维数组、二维数组的内存均已创建,为静态内存;3、内存为10、字符串未填满,后面的内存存放'\0',解析为NULL*/char s[5][10] = {"asc", "asdf", "fggvd"};  qsort(s, 3, sizeof(s[0]), cmp);for (int i = 0; i < 3; i++) {printf("%s\n", s[i]);}return 0;
}


1.3 struct型

#include <stdio.h>
#include <stdlib.h>typedef struct {int key;double val;
} Node;void change1(Node* a) {a->key = 11111;
}// void change2(Node a) {  // 编译会报错,必须用指针!
//     a.key = 222222;
// }int cmp(const void* _a, const void* _b)
{Node *a = (Node *)_a;Node *b = (Node *)_b;if (a->val != b->val) {      // aa->val 与 (*aa).val 等效return (a->val > b->val) ? 1 : -1;  // 按值升序} else {return a->key - b->key;  // key为序号,如此保持原顺序}
}int main()
{// Node arr[10];// int n;// scanf("%d", &n);// for (int i = 0; i < n; i++)// {//     arr[i].key = i + 1;  // Node arr[10] 创建的数组,与 char *arr[10]数组不一样,后者需要创建指针的8字节内存//     scanf("%lf", &arr[i].val);// }// qsort(arr, n, sizeof(arr[0]), cmp);Node arr[10] = {{1, 10.1},{2, 3.4},{3, 3.4},{4, 6.666}};change1(arr);// change2(arr + 1);// printf("%d\n", sizeof(arr));  // 160个字节// printf("%d\n", sizeof(arr[0]));  // 16个字节qsort(arr, 4, sizeof(arr[0]), cmp);for (int i = 0; i < 4; i++)printf("%d   %lf\n", arr[i].key, arr[i].val);return (0);
}

1.4 int型数组

C代码1:

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

测试输出:

PS D:\CODE\test2>  & 'c:\Users\Steve_long\.vscode\extensions\ms-vscode......
3
4
5
1
1 4 5

C代码2:

#include <stdio.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{return (*(int *)b - *(int *)a);  // 降序
}int main()
{int n = 3;int arr[3] = {1, 2, 3};qsort(arr, n, sizeof(arr[0]), cmp);for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

1.4 char型数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{return (*(char *)a - *(char *)b);  // (char *)a 类似接口形参:const char *a;
}                                      // 指针接收int main()
{// char s[10];// scanf("%s", s);char s[20] = "sfsfsdfgaaasa";printf("%d\n", sizeof(s[0]));  // 1个字节qsort(s, strlen(s), sizeof(s[0]), cmp);  // aaaadfffgssssprintf("%s", s);return (0);
}

1.5 double型数组

#include <stdio.h>
#include <stdlib.h>int cmp(const void *a, const void *b)
{return ((*(double *)a - *(double *)b > 0) ? 1 : -1); // double类型做减法不一定是整数,所以返回 1、-1
}int main()
{double s[1000];int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%lf", &s[i]);qsort(s, n, sizeof(s[0]), cmp);for (int i = 0; i < n; i++)printf("%lf ", s[i]);return 0;
}

更多推荐

C快排qsort()【char *arr[10]、char arr[10][10]、char arr[10]、struct型】、(char *)malloc(s

本文发布于:2024-03-12 03:54:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730636.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:arr   char   qsort   sizeof   malloc

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!