C语言模拟实现标准库函数之qsort()_c 函数库中的qsort实现-程序员宅基地

技术标签: C语言模拟实现标准库函数  qsort()  

qsort

编译器函数库自带的快速排序函数。

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

参数解释:
  • void*base-待排序数组首地址
  • size_t num-数组中待排序元素数量
  • size_t width-各元素的占用空间大小
  • int(__cdecl*compare)(const void*,const void*)-指向比较两个元素的函数的指针
qsort函数的用法
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */

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

int main ()
{
  int n;
  int values[] = { 40, 10, 100, 90, 20, 25 };
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  system("pause");
  return 0;
}

这里写图片描述

例子2:

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */

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

int main()
{
    char s[3][4] = { "z","g","c" };  //字符串数组排序 
    qsort(s, 3, sizeof(s[0]), compare); //sizeof(s[0])=sizeof(char)
    for (int i = 0; i<3; i++)
        printf("%s\n", s[i]);
    system("pause");
    return 0;
}

这里写图片描述

模拟实现qsort

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

/*
判断n1,n2元素大小,n1比n2大返回正数;小返回负数,相同返回0
*/
int cmp(const void*n1, const void*n2)
{
    return *(char*)n1 - *(char*)n2;                //升序  
}

/*
交换每个字节
sizeof(char) = 1;sizeof(int ) = 4;
sizeof(arr1[0])=1;sizeof(arr[0])=4;
*/
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* n1, const void*n2))      //模拟实现qsort  
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - 1 - i; j++)
        {
            int ret = cmp(((char*)base + (j*width)), ((char*)base + (j + 1)*width));
            if (ret>0)
            {
                Swap(((char*)base + (j*width)), ((char*)base + (j + 1)*width), width);
            }
        }
    }
}

int main()
{
    int i = 0;
    int arr[] = { 1, 4, 7, 5, 6, 9 };
    bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");


    /*
    printf输出格式"%s"
    */
    char arr1[] = { 'a','f','y','w','b' };
    bubble_sort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);
    for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++)
    {
        printf("%c ", arr1[i]);
    }
    printf("\n");
    system("pause");
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csdn_kou/article/details/80158194

智能推荐

图像噪声的概念与理论分析_图像噪音-程序员宅基地

文章浏览阅读1k次,点赞28次,收藏22次。图像噪声是图像在摄取或传输时所受的随机信号干扰,是图像中各种妨碍人们对其信息接受的因素。很多时候将图像噪声看成是多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。图像噪声是多种多样的,其性质也千差万别,所以了解噪声的分类是很有必要的。_图像噪音

c++关联容器详细介绍_c++的关联容器-程序员宅基地

文章浏览阅读1.3k次,点赞45次,收藏22次。关联容器是C++标准库的一部分,用于存储和管理具有键值对的数据元素。与顺序容器(如vector和list)不同,关联容器的主要特点是它们能够快速查找特定键的值。这是因为关联容器内部使用了高效的数据结构(如二叉树或哈希表)来组织数据。std::set:一个集合,包含唯一元素,按特定顺序排序。std::map:一个映射,包含键值对,其中键是唯一的。std::multiset和std::multimap:类似于set和map,但允许键的重复。_c++的关联容器

el-select下拉框选项的样式修改(背景色、hover、字体等)_el-select hover-程序员宅基地

文章浏览阅读5.5w次,点赞30次,收藏144次。一:如何修改el-select下拉框中选项的样式,网上的方法一般有两种:1.找到下拉框的类名,写一个全局的样式。2.通过/deep/来修改.el-select-dropdown__item的样式内容3.通过popper-class设置的类名添加样式以上几种方式中,第二种和第三种是无法生效的,而第一种形式虽然可以,但是会造成样式污染,在打包上传到服务器的时候,其他地方的样式可能会因此发生改变。二:问题分析上图中显示的是当选中el-select的选项时页面的结构,选项的容器并不在挂载的div#ap_el-select hover

CDH配置hive.exec.dynamic.partition.mode_cdh hive.exec.dynamic.partition.mode-程序员宅基地

文章浏览阅读904次。cdh配置hive.exec.dynamic.partition.mode看图说话,我是用的server2,所以根据自己情况配置_cdh hive.exec.dynamic.partition.mode

matlab print用法,使用Matlab:错误使用 mprint (line 231) Wrong # rnames in mprint,怎么解决...-程序员宅基地

文章浏览阅读813次。请问大牛们:在使用Matlab:错误使用 mprint (line 231) Wrong # rnames in mprint,怎么解决?程序如下:T=12;N=10;W=normw(W1);y=A(:,[23]);x=A(:,[17:22]);for t=1:Tt1=(t-1)*N+1;t2=t*N;wx(t1:t2,:)=W*x(t1:t2,:);endxconstant=ones(N*T,1..._matlab print报错

Java substring用法_java substring的用法-程序员宅基地

文章浏览阅读467次。public String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,一直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。示例: "ham_java substring的用法

随便推点

npm install vuex --save时报错解决 vue下载vuex插件报错_npm n install vuex --save unknown command: "n-程序员宅基地

文章浏览阅读4.9k次。npm install --save vuexnpm ERR! code ENOSELF原因:创建项目时命名成了vuex,npm 安装的包不能将自身作为依赖。解决办法:package.json中name=‘vuex’ 改成 name=‘vuextest’或者另外的名字试试看。_npm n install vuex --save unknown command: "n

用Docker Compose搭建WordPress时出现The designated data directory /var/lib/mysql/ is unusable的错误-程序员宅基地

文章浏览阅读3k次。用Docker Compose搭建WordPress时出现The designated data directory /var/lib/mysql/ is unusable的错误_the designated data directory /var/lib/mysql/ is unusable. you can remove al

信息系统项目管理(五)信息系统安全技术_信息系统的准确性,完整性,可靠性,稳定性-程序员宅基地

文章浏览阅读7.3k次,点赞5次,收藏30次。信息系统安全技术知识梳理_信息系统的准确性,完整性,可靠性,稳定性

Spring Cloud-Feign丢失Cookie和Header信息的问题(Finchley.RC2版本)_自动运行的feign丢失cookie-程序员宅基地

文章浏览阅读2k次。最近在做项目的时候发现,微服务使用feign相互之间调用时,存在session丢失的问题。例如,使用Feign调用某个远程API,这个远程API需要传递一个鉴权信息,我们可以把cookie里面的session信息放到Header里面,这个Header是动态的,跟你的HttpRequest相关,我们选择编写一个拦截器来实现Header的传递,也就是需要实现RequestInterceptor接口,具体代码如下:@Configuration @EnableFeignClients(basePackag_自动运行的feign丢失cookie

javascript复选框_使用javascript动态添加带有复选框的表格行-程序员宅基地

文章浏览阅读1k次。javascript复选框 标题:使用JavaScript动态添加带有复选框的表格行 作者:Vivek Kapile 电子邮件:已快照 语言:JavaScript 平台:ASP.net中JavaScript 技术:用于ASP.net 级别:初学者 介绍 此代码将为想要学习的初学者提供帮助,帮助他们了解如何通过JavaScript在表中动态创建复选框。 我已经介..._js动态向td添加复选框

React vscode 创建 react 项目流程【超详细】-程序员宅基地

文章浏览阅读1.7w次,点赞27次,收藏116次。文章目录一、安装node二、配置淘宝镜像三、配置 vscode(win10)四、全局安装脚手架五、创建项目一、安装node请在官网下载安装:https://nodejs.org/zh-cn/vscode 中 点击 ( ctrl + `) 调出终端输入指令node -v,能显示版本号,说明 node 已经装好了输入指令npm -v,能显示版本号,说明 npm 可以使用了点击链接查看图文教程https://blog.csdn.net/qq_45677671/article/detail_react vscode

推荐文章

热门文章

相关标签