目录
1.qsort函数的定义
函数定义:
void qsort(
void* base,
size_t num,
size_t size,
int(*compar)(const void*, const void*));
头文件:<stdlib.h>
函数功能:对一个数组进行排序,数组有num个元素,每个元素的大小为size;
参数base:指向数组首元素地址的指针;
参数num:数组元素个数;
参数size:数组中每个元素的大小;
参数(*compar)(const void*, const void*):指向比较函数的函数指针。
2.compar参数
int compar (const void* p1, const void* p2);
compar是一个函数指针,它指向一个比较两个元素的函数,两个形参的类型必须是void*型。
- 如果compar返回值大于0,则p1指向的元素排在p2指向的元素的前面;
- 如果compar返回值小于0,则p1指向的元素排在p2指向的元素的后面;
- 如果compar返回值等于0,则p1指向的元素等于p2指向的元素。
3.int数组排序
代码如下:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int CompInt(const void *xp, const void *yp)
{
assert(xp);
assert(yp);
const int *x = (const int*)xp;
const int *y = (const int*)yp;
if (*x > *y){
return 1;
}
else if (*x < *y){
return -1;
}
else{
return 0;
}
}
int main()
{
int a[] = { 2, 4, 5, 3, 344, 5677, 3221, 332, 346754, -54, -90 };
int num = sizeof(a) / sizeof(a[0]);
qsort(a, num, sizeof(int), CompInt);
for (int i = 0; i < num; i++){
printf("%d ", a[i]);
}
printf("\n");
system("pause");
return 0;
}
结果如下:
4.double数组排序
代码如下:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int CompDouble(const void *xp, const void *yp){
assert(xp);
assert(yp);
const double *x = (const double*)xp;
const double *y = (const double*)yp;
if (*x > *y){
return 1;
}
else if (*x < *y){
return -1;
}
else{
return 0;
}
}
int main()
{
double b[] = { 2.0, 3.4, 5.6, 785.5, 980.0, 34566.5, 341.2, -1.0, -234.4 };
int num = sizeof(b) / sizeof(b[0]);
qsort(b, num, sizeof(double), CompDouble);
for (int i = 0; i < num; i++){
printf("%.1f ", b[i]);
}
printf("\n");
system("pause");
return 0;
}
结果如下:
5.字符串数组排序
代码如下:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int CompString(const void *xp, const void *yp)
{
assert(xp);
assert(yp);
const char **x = (const char**)xp;
const char **y = (const char**)yp;
const char *_x = *x;
const char *_y = *y;
while (*_x||*_y){
if (*_x > *_y){
return 1;
}
else if (*_x < *_y){
return -1;
}
_x++, _y++;
}
return 0;
}
int main()
{
char *arr[] = { "abcd1234", "ndhfkkji", "dejd4678", "oshdb = 839", "qwd, lkd0" };
int num = sizeof(arr) / sizeof(arr[0]);
qsort(arr, num, sizeof(char*), CompString);
for (int i = 0; i < num; i++){
printf("%s\n", arr[i]);
}
system("pause");
return 0;
}
结果如下:
6.模拟实现qsort函数
代码如下:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int CompString(const void *xp, const void *yp)
{
assert(xp);
assert(yp);
const char **x = (const char**)xp;
const char **y = (const char**)yp;
const char *_x = *x;
const char *_y = *y;
while (*_x||*_y){
if (*_x > *_y){
return 1;
}
else if (*_x < *_y){
return -1;
}
_x++, _y++;
}
return 0;
}
static void Swap(char *x, char *y,size_t num)
{
while (num){
char tmp = *x;
*x = *y;
*y = tmp;
x++, y++;
num--;
}
}
void MyQsort(void *base, size_t num, size_t size, int(*comp)(const void *, const void *))
{
assert(base);
assert(comp);
char *p = (char*)base;
for (size_t i = 0; i < num - 1; i++){
int flag = 0;
for (size_t j = 0; j < num - i - 1; j++){
if (comp(p + j*size, p + (j + 1)*size)>0){
Swap(p + j*size, p + (j + 1)*size, size);
flag = 1;
}
}
if (!flag){
break;
}
}
}
int main()
{
char *arr[] = { "abcd1234", "ndhfkkji", "dejd4678", "oshdb = 839", "qwd, lkd0" };
int num = sizeof(arr) / sizeof(arr[0]);
MyQsort(arr, num, sizeof(char*),CompString );
for (int i = 0; i < num; i++){
printf("%s\n", arr[i]);
}
system("pause");
return 0;
}
结果如下: