c语言重要库函数解读 和模拟实现————Qsort
Posted 万物皆为二叉树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言重要库函数解读 和模拟实现————Qsort相关的知识,希望对你有一定的参考价值。
Qsort排序
Qsort功能
使用该函数进行任意数据类型排序。
冒泡排序
给定arr如图所示 10个元素 要求按照从小到大进行排序
排序 思路 前后比较 若前面小于后面 则满足顺序排列,否则 则交换顺序
从此图可看出来 判断的关键在于 两点
- 比较对象为相邻元素
- 若顺序则前小后大 否则换掉
实现判断
if (arr[i] > arr[i + 1])
int tmp = arr[i];
arr[i ] = arr[i+1];
arr[i + 1] = tmp;
经过次if语句则可交换前后
那需要交换多少次呢 ? 有多少元素需要交换呢?
需要交换的肯定是全体数组,那交换多少次呢 ,当然前面交换的我们就不用在交换了 所以 就是 交换的次数在减去已经交换过的元素个数
冒泡排序本质: 冒泡排序顺序排序本质就是将 最大的换到最后面 每次排序送到后面去一个 那最后那一个就不需要换 排一次 最后的元素对一个 对应的也就少拍一次。
int main()
int arr[] = 1,22,67,89,45,67,34,56,78,2 ;
int i = 0;
for (i = 0; i < 10 - 1; i++)
for (int j = 0; j < 10 - 1 - i; j++)
if (arr[j] > arr[j + 1])
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
for (i = 0; i < 10 ;i++)
printf("%d ", arr[i]);
return 0;
冒泡排序 看是在比较 实际上在将大数后移。
Qsort使用
举例 排序一个 整形数组
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int _Int(const void* p, const void* r)
return (*(int*)p - *(int*)r);
int _Char(const void* p, const void* r)
return (*(char*)p -*(char*)r);
int main()
int arr[] = 1,3,4,5,32,1,2,22,345,987 ;
char arr2[] = "afedpo";
qsort(arr2, (sizeof(arr2) / sizeof(arr2[0])),
sizeof(arr2[0]),
&_Char);
for (int i = 0; i < 6; i++)
printf("%c", arr2[i]);
return 0;
Qsort模拟实现
Qsort 模拟实现 使用 冒泡排序法
冒泡排序的本质是 左右相邻元素比较 将最大的换到最后面
冒泡排序的核心就是if( )判断语句的书写
整形数组判断是
` if (arr[j] > arr[j + 1])
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
`
使用Qsort则使用我们的自己函数传参完成
重点判断是
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width))
char的步长是1 加上需要跳过的 j元素个数 *每个元素大小 刚好跳到
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int _Int(const void* p, const void* r)
return *(char*)p - *(char*)r;
void _swap(char* buf1,char *buf2,int size)
int i = 0;
for (i=0;i<size;i++)
char a = *(buf1+i);
*(buf1 + i) = *(buf2 + i);
*(buf2 + i) = a;
void My_qsot(void* base,
size_t num,
size_t width,
int(*com)(const void*p, const void*r))
size_t i = 0;
size_t j = 0;
for (i = 0; i < num; i++)
for (j = 0; j < num - i - 1; j++)
if (com((char*)base + j * width,
(char*)base + (j + 1) * width)>0)
_swap((char*)base + j * width,
(char*)base + (j + 1) * width, width);
int main()
int arr[] = 2,3,1,4,6,9,81,12,11,10 ;
size_t sz = sizeof(arr) / sizeof(arr[0]);
My_qsot(arr,sz,sizeof(arr[0]),&_Int);
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
- 复制的时候 一个字节一个字节复制。以字节最小单位。
以上是关于c语言重要库函数解读 和模拟实现————Qsort的主要内容,如果未能解决你的问题,请参考以下文章