“qsort函数排序出现问题”

img

img


为何这个qsort排序是错误的,不应该“zhangwu"在“zhangsan”的上面吗?(zhangsan的字节长度不是大于zhangwu的吗)

不是,strcmp按照字典序排列的
所谓字典序就是首先比较第一个字母,如果相同比较第二个
也就是单词在英文字典里的先后关系。
和长度无关。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7801265
  • 这篇博客也不错, 你可以看下【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序
  • 除此之外, 这篇博客: 指针进阶(三) (跑路人笔记)中的 模拟实现qsort函数(使用冒泡排序) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 不妨先看一下真正的qsort函数的声明
    ![[Pasted image 20220106214158.png]]

    size_t的意思是unsigned int 不过使用size_t可以提高兼容度
    ![[Pasted image 20220106215957.png]]

    我们看一下我们代码的所有部分再拆开进行讲解

    int cmp(const void* p1, const void* p2)
    {
    	return *(int*)p1 - *(int*)p2;
    }
    void swap (void* p1, void* p2, size_t size)
    {
    	for (int i = 0; i < size; i++)
    	{
    		char tmp = *((char*)p1 + i);
    		*((char*)p1 + i) = *((char*)p2 + i);
    		*((char*)p2 + i) = tmp;
    	}
    
    }
    void qsort_bubble(void* base,
    				size_t count, size_t size,
    				int (*cmp)(const void* p1, const void* p2))
    {
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < count - 1; i++)
    	{
    		for (j = 0; j < count - 1 - i; j++)
    		{
    			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size)>0)
    			{
    				swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
    			}
    		}
    
    	}
    }
    int main(void)
    {
    	int arr[10] = { 0,2,3,1,4,5,6,7,9,8 };
    	//qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp);
    	qsort_bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp);//要实现的函数
    	return 0;
    }
    

    为了方便我们将交换部分单独创建一个函数
    难点在拆解讲解讲解