快排函数

本文详细介绍了标准库函数qsort()的使用方法,并通过多个示例演示如何进行整型、浮点型、字符型及结构体数组的排序。文章还讲解了如何通过自定义比较函数实现升序与降序排列。

 快排函数是qsort();  头文件是 <stdlib.h>

快排函数有4个参数, 分别是要 数组的索引,数组的长度, 数组的一个单位的字节数 和 比较函数。

直接上例子了!

#include <stdio.h>
#include <stdlib.h>
int comp(const void *a,const void *b){
	return *(int *)a - *(int *)b;
}
int main() {
	int s[100], i, n;
    while(~scanf("%d",&n)) {
		for(i = 0; i < n; i++)
			scanf("%d", &s[i]);
		qsort(s, n, sizeof(s[0]), comp);
		for(i = 0; i < n; i++) 
			printf("%d ", s[i]);
		printf("\n");
	}
}


上面的是 int 数组 递增排序。  期中comp() 就是比较函数, a 比 b 大就要返回正数, 等于返回0  否则返回负数。

comp() 也可以这样写  return  *(int *) a > *(int *) b ? 1 : -1;  表示 a 大于 b 就返回正数, a小于等于b 就返回负数(方正两个数一样,交换顺序也一样)

如果要 递减排序 就改改比较函数就可以了。

int comp(const void *a,const void *b){
	return *(int *)b - *(int *)a;
}


在上个double数组的快排例子。

#include <stdio.h>
#include <stdlib.h>
int cmp(const void * a, const void * b) {
	return  *(double*)a - *(double*)b;
}
int main() {
	double s[1000];
	int i, n;
	while(~scanf("%d", &n)) {
		for(i = 0; i < n; i++)
			scanf("%lf", &s[i]);
		qsort(s, n, sizeof(s[0]), cmp);
		for(i = 0;i < n; i++)
			printf("%lf\n", s[i]);
		printf("\n");
	}
}


double的也是一样的。  就是强制为 (double *) 就好了。  原理一样。

在上个字符串快排

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b) {
	return strcmp((char *)a, (char *)b);
}
int main() {
	char c[1000][100];
	int i, n;
	while(~scanf("%d", &n)) {
		for(i = 0; i < n; i++)
			scanf("%s", c[i]);
		qsort(c, n, sizeof(c[0]), cmp);
		for(i = 0; i < n; i++)
			printf("%s\n", c[i]);
	}
}


上面的代码是 字符串 递增快排。 返回的就用 strcmp()    原理也是一样, 小就返回负数, 等于就0, 大就返回正数

如果想递减的 那就 returned -strcmp(……);

 

最后上个结构体的。

#include <stdio.h>
#include <stdlib.h>
typedef struct {
	int a;
	int num;
	char str[100];
} list;
list s[1000];
int cmp(const void *a, const void *b) {
	return (*(list *)a).num - (*(list *)b).num;
}
int main() {
	int i, n;
	while(~scanf("%d", &n)) {
		for(i = 0; i < n; i++)
			scanf("%d%d %s", &s[i].a, &s[i].num, &s[i].str);
		qsort(s, n, sizeof(s[0]), cmp);
		for(i = 0; i < n; i++)
			printf("%d %d %s\n", s[i].a, s[i].num, s[i].str);
	}
}

上面的是 一结构体内的 num成员 递增快排,

 如果想按字符串递减快排也可以换成

#include <string.h>
int cmp(const void *a, const void *b) {
	return -strcmp((*(list *)a).str, (*(list *)b).str);
}


原理就只有一个,就是操作返回值

  两个形参,分别是a, b;

qsort() 会看返回值;

如果 a - b  与   你设置的返回值 同号, 就是递增, 例  return  *(int *) a - *(int *) b;  和 return  strcmp((char *) a, (char *) b);  都是 a - b  与 设置的返回值 的同号的。

如果 a - b 与 你设置的返回值 异号, 就是递减,  例 return *(int *)b - *(int *) a; 和 return -strcmp((char *) a, (char *) b);

希望对大家有用。

C++ 中有多种实现快速排序的方式,常见的是使用标准库中的 `sort()` 函数,也可以模拟实现类似 `qsort` 的函数。 ### `sort()` 函数 `sort()` 函数是 C++ 标准库中的一种排序方法,使用类似于快排的方法,时间复杂度为 $n*log_2(n)$,执行效率较高,适合对较多数据进行排序 [^2]。 - **使用方法**:`sort()` 函数包含在头文件 `<algorithm>` 中,有三个参数,第三个参数可不写 [^2][^4]。 - 第一个参数是要排序的数组的起始地址。 - 第二个参数是结束的地址(最后一位要排序的地址)。 - 第三个参数是排序的方法,可以是从大到小也可是从小到大,若不写第三个参数,默认的排序方法是从小到大排序。其使用模板为 `sort(start, end, 排序方法)`。 - **代码示例**: ```cpp #include <iostream> #include <algorithm> int main() { int a[20] = {2, 4, 1, 23, 5, 76, 0, 43, 24, 65}; // 输出排序前的数组 for (int i = 0; i < 10; i++) { std::cout << a[i] << " "; } std::cout << std::endl; // 使用 sort 函数进行排序,默认从小到大 std::sort(a, a + 10); // 输出排序后的数组 for (int i = 0; i < 10; i++) { std::cout << a[i] << " "; } std::cout << std::endl; return 0; } ``` - **自定义排序方法**:第三个参数 `cmp` 是一个自定义比较器(判断函数)。对于不同类型的数据,可通过修改比较函数来实现不同的排序规则,也可用于结构体的排序及多级排序 [^5]。 ```cpp #include <iostream> #include <algorithm> // 从大到小排序的比较函数 bool cmp(int i, int j) { return i > j; } struct student { int number1; int number2; }; // 结构体一级排序 bool cmpStruct1(student i, student j) { return i.number1 < j.number1; } // 结构体二级排序 bool cmpStruct2(student a, student b) { if (a.number1 != b.number1) return a.number1 < b.number1; else return a.number2 < b.number2; } int main() { int arr[10] = {2, 4, 1, 23, 5, 76, 0, 43, 24, 65}; std::sort(arr, arr + 10, cmp); student students[3] = {{2, 3}, {1, 5}, {2, 1}}; std::sort(students, students + 3, cmpStruct2); return 0; } ``` ### 模拟实现 `qsort` 函数 可以使用冒泡排序的思想模拟实现 `qsort` 函数,代码如下 [^3]: ```cpp #include <iostream> // 交换函数 void swap(char* buf1, char* buf2, size_t width) { for (size_t i = 0; i < width; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } // 模拟实现 qsort 函数 void my_qsort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2)) { for (size_t i = 0; i < sz - 1; i++) { for (size_t j = 0; j < sz - 1 - i; j++) { if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) { swap((char*)base + j * width, (char*)base + (j + 1) * width, width); } } } } // 比较函数示例 int int_cmp(const void* e1, const void* e2) { return (*(int*)e1 - *(int*)e2); } int main() { int arr[5] = {3, 1, 4, 2, 5}; my_qsort(arr, 5, sizeof(int), int_cmp); for (int i = 0; i < 5; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值