首页 > 其他分享 >C语言qosrt排序问题

C语言qosrt排序问题

时间:2024-12-02 11:36:54浏览次数:5  
标签:MicroLib qosrt int void qsort C语言 testcnt 排序

在MDK中使用qsort排序时发现会卡死:

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

int testdata[200] = {0,6,3};

int testcnt;
int compare(const void *a, const void *b) {
    testcnt++;
    if (*(int *)a < *(int *)b) return -1;
    else if (*(int *)a > *(int *)b) return 1;
    else return 0;
}

void qsort_test(void) {
    qsort(testdata, 200, sizeof(int), compare);

    testcnt = testcnt;
}

1、打开MicroLib使用qsort会导致排序卡死,但是增加栈空间后可以正常排序
2、 关闭MicroLib排序正常

3、打开MicroLib后,testcnt计数19902次,而关闭MicroLib后testcnt计数在1139次,可见打开MicroLib时调用的比较函数次数远大于未打开MicroLib时

可能的原因:MicroLib中的qsort函数可能使用了函数递归的方法,有栈溢出问题,所以当排序的数据量大时,会导致栈空间溢出

而标准C库中的qsort函数使用了伪递归的方法,仅在函数内部递归,不会有栈溢出问题

标签:MicroLib,qosrt,int,void,qsort,C语言,testcnt,排序
From: https://www.cnblogs.com/yeshenmeng/p/18581338

相关文章

  • 浙大翁凯C语言网课笔记自整理——C语言入门必看(持更)
    第一个视频:C语言简史为了玩小游戏SpaceTravel,需要在电脑上使用小型的操作系统。而当时只有大型机GE-645,以及对应的Multics系统。于是肯·汤普森和丹尼斯·里奇写出了,Unix操作系统。记忆:M→多复杂      U→小相对简单 1.1.1计算机与编程语言计算机是怎......
  • C语言中 switch-case`语句的优劣分析:全面深入探讨
    在C语言中,switch-case语句是一种常用的多分支选择结构,它允许根据一个变量的不同值执行不同的代码块。与传统的if-else语句相比,switch-case语句在某些场景下具有明显的优势,但也存在一些不足之处。本文将全面深入地探讨switch-case语句的优点和缺点,并通过具体示例进行......
  • 【C语言】【勾股定理】求满足 a+b+c=n 并且是美丽三元组(a^2 + b^2 = c^2)的数量。
    题目:        我们定义一个由三个自然数a,b,c(a<b<c)组成,并满足a^2+b^2=c^2的三元组为美丽三元组,例如3^2+4^2=5^2。        现给定一个正整数n,求满足a+b+c=n并且是美丽三元组的数量,若不存在这样的三元组则输出NoJoyfine,如果答案唯一则输出这个三......
  • Swift实现高效链表排序:一步步解读
    文章目录前言摘要问题描述题解解题思路Swift实现代码代码分析示例测试与结果时间复杂度空间复杂度总结关于我们前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。148.排序链表不积跬步,无以至千里;不积小流,无以成江海,Swift社区伴......
  • 洛谷 P3395 路障 C语言 bfs(想复杂的思路)
    题目:https://www.luogu.com.cn/problem/P3395题目描述B君站在一个n×n 的棋盘上。最开始,B君站在(1,1) 这个点,他要走到(n,n) 这个点。B君每秒可以向上下左右的某个方向移动一格,但是很不妙,C君打算阻止B君的计划。每秒结束的时刻,C君会在 (x,y)上摆一个路障。B......
  • C/C++ 删除字符串中重复的字符并排序算法详解及源码
    删除重复字符算法详解及代码思路创建一个数组,默认所有元素都是0;遍历字符串的每个字符;判断当前字符是否已经出现过,如果没有出现过,则将数组中对应位置设为0,如果当前字符已经出现过,则将数组中对应位置设为1;遍历数组把值为0对应位置的字符加入到结果字符串中;返回结果字符串。代......
  • C语言——管理系统
    1整体代码#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.h>#include<string.h>enumOperator{Quit,Insert,Show,Search,Modify,Delete,Sort};//1创建系统typedefstructMM{ charname[20]; ......
  • 【研一小白零基础学习C语言(五)】
    零基础学习C语言(五)研一人机与环境工程零基础学习C语言文章目录前言一、switch语句二、while循环、for循环和do...while循环三、break和continue语句前言主要介绍了选择语句switch语句、三种循环语句,while循环、for循环和do…while循环,并给出相应的例题,break和co......
  • C语言——指针基础
    1指针基础怎么获得变量地址1如何产生一个指针变量 ——>类型*标识符; int*p1; char*p2; double*p3; //不同类型的基本指针占用内存是一样的都是4个字节(32位)/8个字节(64位),都是存的地址2数组名是数组首地址但不是普通指针——>数组名绑定的一段内存可以......
  • 数据结构 ——— 快速排序的时间复杂度以及规避最坏情况的方法
    目录前言快速排序的时间复杂度快速排序时间效率最坏的情况规避快速排序最坏情况的方法三数取中法将三数取中放在快速排序算法中(以前后指针版本举例)前言在前几章学习了快速排序不同版本的实现,他们的时间效率都是差不多一样的数据结构———快速排序算法的实现(前后指......