qsort函数

目录

1.qsort函数的定义

2.compar参数

3.int数组排序

4.double数组排序

5.字符串数组排序

6.模拟实现qsort函数


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;
}

结果如下:

qsort函数

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;
}

结果如下:

qsort函数 

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;
}

结果如下:

qsort函数 

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;
}

结果如下:

qsort函数

上一篇:【C语言】冒泡排序+qsort实现原理


下一篇:qsort函数