C和C++里的qsort&sort快排函数
qsort在C语言的stdlib.h头文件里面
int num[100];
//写函数:
int cmp_int(const void* _a, const void* _b) //参数格式固定
{
int *a = *(int*)_a; //强制类型转换
int *b = *(int*)_b;
return *a - *b;
} //(这个cmp函数得自己写)
//注意cmp函数的返回值必须是int型
//调用:
qsort(num,100,sizeof(num[0]),cmp_int);
//数组名、长度、数组元素长度、排序方法
注:
参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回 *b-*a 即可。
例如:
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
//从大到小排序
int main()
{
int n=0; //个数
int arr[40]={0};
scanf("%d",&n);
int i=0;
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
//qsort--C语言函数
qsort(arr,n,4,cmp_int);
return 0;
}
补充:
1.对double型数组排序
int cmp_double(const void* _a , const void* _b) //参数格式固定
{
double* a = (double*)_a; //强制类型转换
double* b = (double*)_b;
return *a > *b ? 1 : -1; //特别注意
}
qsort(arr,100,sizeof(arr[0]),cmp_double);
注:
在对浮点或者double型的一定要用三目运算符,因为函数返回值是int,直接相减可能精度缺失返回 0,表示相等,失去原本来存在的大小关系。
2.对字符串进行排序
int cmp_string(const void* _a , const void* _b) //参数格式固定
{
char* a = (char*)_a; //强制类型转换
char* b = (char*)_b;
return strcmp(a,b); //比较大小
}
qsort(str,100,sizeof(str[0]),cmp_string);
设想:单个字符或ASCII直接比较或许也可以。
sort在C++语言的algorithm头文件里面
一、sort(a,a+10),没有第三个参数,实现的是从小到大
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]= {9,6,3,8,5,2,7,4,1,0};
for(int i=0; i<10; i++)
cout<<a[i]<<endl;
sort(a,a+10);
for(int i=0; i<10; i++)
cout<<a[i]<<endl;
return 0;
}
二、sort(a,a+10,complare),自定义排序方式
bool complare(int a,int b)
{
return a>b;
}
sort(a,a+10,complare);
三、sort函数第三个参数可以选择排序原则
less<数据类型>() //从小到大排序
greater<数据类型>() //从大到小排序
例如:
sort(a,a+10,less<int>());
sort(a,a+10,greater<int>());
sort(a,a+10,less<char>());
sort(a,a+10,greater<char>());
–over–