c语言重要库函数解读 和模拟实现————Qsort

Posted 万物皆为二叉树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言重要库函数解读 和模拟实现————Qsort相关的知识,希望对你有一定的参考价值。

Qsort排序

Qsort功能

使用该函数进行任意数据类型排序。

冒泡排序

给定arr如图所示 10个元素 要求按照从小到大进行排序

排序 思路 前后比较 若前面小于后面 则满足顺序排列,否则 则交换顺序

从此图可看出来 判断的关键在于 两点

  1. 比较对象为相邻元素
  2. 若顺序则前小后大 否则换掉
    实现判断
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;

  1. 复制的时候 一个字节一个字节复制。以字节最小单位。

以上是关于c语言重要库函数解读 和模拟实现————Qsort的主要内容,如果未能解决你的问题,请参考以下文章

c语言重要库函数解读 和模拟实现————常用字符函数

C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试题

模拟实现qsort atoi函数,小白快来看

模拟实现qsort atoi函数,小白快来看

C语言之qsort函数进行排序

C语言--回调函数实列 模拟qsort函数