一、qsort函数
qsort函数C语言编译器函数库自带的排序函数。
在C语言中qsort函数的原型为:
其中:
(1)为Pointer to the first object of the array to be sorted, converted to a void*; 含义为指向要排序数组的第一个地址,类型为(void*)。
(2)为Number of elements in the array pointed to by base. 含义为传入数组的元素的个数。
(3)为Size in bytes of each element in the array. 含义为传入数组中每个元素的字节大小。
(4)为Pointer to a function that compares two elements. 含义为指向比较两个元素的函数的指针。其原型是
int compar (const void* p1, const void* p2);
对于compar函数,需要将待比较的两个元素的地址传入其中,通常在使用时,有如下代码展示:
#include <stdio.h>
int compar(const void* p1, const void* p2)
{
return (*(int*)p1) - (*(int*)p2);
//由于传过来的地址类型是void*,所以在进行运算时需要进行强制类型转换。
}
int main()
{
int arr[]= { 5,3,7,9,2,0,4,8,1,6 };
int num = sizeof(arr) / sizeof(arr[0]);
qsort(arr, num, sizeof(arr[0]), compar);
for (int i = 0; i < num; i++)
printf("%d ", arr[i]);
return 0;
}
运算结果如下:
注:对于compar函数,其返回类型为整形分别为“>0,=0,<0”。
二、qsort函数的排序思想
对于qsort的排序思想,我们可以参考冒泡排序。它们的核心思想就是从前到后两两依次比较(按从小到大为例),如果前面的大于后面的,则交换两个元素。
为了能更好的理解该函数的运算思想,最好的学习方法就是手动模拟一遍。
图示及代码如下:
#include <stdio.h>
int main()
{
int arr[]= { 5,3,7,9,2,0,4,8,1,6 };
int num = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < num - 1; i++)//趟数
{
for (int j = 0; j < num - i - 1; j++)//交换的次数
{
if (arr[j] > arr[j + 1])//如果前面的大于后面的,则进行交换。
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (int i = 0; i < num; i++)
printf("%d ", arr[i]);
return 0;
}
以上便是qsort内部的算法思想,只需理解便可,在日常使用时,只需直接调用qsort函数。但是需要注意的是,在比较非整形元素时,compar函数返回时,所需要的强制类型转换需要改变。
以下将写出整形、字符两种比较的代码:
(1)整形
#include <stdio.h>
int compar(const void* p1, const void* p2)
{
return (*(int*)p1) - (*(int*)p2);
}
int main()
{
int arr[]= { 5,3,7,9,2,0,4,8,1,6 };
int num = sizeof(arr) / sizeof(arr[0]);
qsort(arr, num, sizeof(arr[0]), compar);
for (int i = 0; i < num; i++)
printf("%d ", arr[i]);
return 0;
}
(2) 字符
#include<stdio.h>
#include<string.h>
int compar(const void* p1, const void* p2)
{
return *((char*)p1) - *((char*)p2);
}
int main()
{
char arr[] = "bcaksbckk";
int num = strlen(arr);
qsort(arr, num, sizeof(arr[0]), compar);
printf("%s", arr);
return 0;
}