c语言重要库函数解读 和模拟实现————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. 复制的时候 一个字节一个字节复制。以字节最小单位。

猜你喜欢

转载自blog.csdn.net/qq_45849625/article/details/114928037