二者都是基于快速排序算法,使用上有些区别
主要内容
- qsort用法
- sort用法
- 区别
qsort用法
原型:
void qsort(void* base, size_t num, size_t size, int (*compare)(const void* ,const void*))
参数
1.待排序数组的首地址,如数组名;
2.数组中待排序元素数量;
3.数组元素所占空间大小;
4.比较函数指针,函数接受两个待比较项的指针,一般要类型转换
一、对int数组排序
int nums[100];
int cmp(const void* p1, const void* p2) {
const int* a1 = (const int*)p1; //使用指向int类型的指针访问值
const int* a2 = (const int*)p2;
return *a - *b;
}//升序排列;如果降序,改为*b - *a
qsort(num, 100, sizeof(int), cmp);
二、对char类型排序(与int类似)
char word[100];
int cmp(const void* p1, const void* p2) {
const char* a1 = (const char*)p1; //使用指向int类型的指针访问值
const char* a2 = (const char*)p2;
return *a - *b;
}//升序排列;如果降序,改为*b - *a
qsort(num, 100, sizeof(char), cmp);
三、对double(float)类型排序(注意返回值是int类型)
double nums[100];
int cmp(const void* p1, const void* p2) {
const double* a1 = (const double*)p1; //使用指向int类型的指针访问值
const double* a2 = (const double*)p2;
// return *a - *b; 不能这样写,结果仍是double
if(*a > *b){
return 1;
}
else if(*a == *b){
return 0;
}
else{
return -1;
}
}//升序排列;
qsort(num, 100, sizeof(char), cmp);
四、对结构体类型一级排序
struct nums {
double data;
int other;
}s[100];
//按照结构体中变量data的大小给结构体数组升序排序
int cmp(const void* p1, const void* p2) {
return *((struct nums*)p1).data > *((struct nums*)p2)->data ? 1 : -1;
}
qsort(s, 100, sizeof(s[0]), cmp);
五、对二维数组二级排序
int s[100][2]; //假设已经初始化好
//对s[i]排序,首先按s[i]中第一个参数升序排列,如果参数相等,再按照第二个参数升序排列
int cmp(const void* p1, const void* p2) {
int* a1 = *(int**)p1, * a2 = *(int**)p2; //将p1,p2强制转化为何种类型,应该和比较数组的维度相同
if (a1[0] == a2[0]) return a1[1] - a2[1];
return a1[0] - a2[0];
}
qsort(s, 100, sizeof(int*), cmp);
sort用法
原型:
template<class RanIt> void sort(RanIt fisrt, RanIt last)
template<class RanIt, class Pred> void sort(RanIt fisrt, RanIt last, Pred pr)
bool compare(int a,int b)
{
return a>b; //降序排列,如果改为return a<b,则为升序
}
sort(*a,*b,cmp);
sort也可以以迭代器(vector、string等迭代器)作为参数,默认升序排列
vector<int>nums //假设已经初始化好
sort(nums.begin(), nums.end());
qsort和sort的区别
1.sort是C++中改进后的排序函数,支持array,vector,deque三种容器,因为它们支持的迭代器为随机访问迭代器。
2.如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符,如果不支持,需要自定义比较函数,传入第三个参数。
标准库自带函数:functional提供了一堆基于模板的比较函数对象:equal_to、not_equal_to、greater、greater_equal、less、less_equal。
升序:sort(begin,end,less()); 降序:sort(begin,end,greater()).
qsort必须自定义比较函数,也比较灵活。
3.cmp函数比较时,一般来说,qsort用“-”,而sort用”>”。
4.从函数原型就可看出,qsort返回值为int, sort返回值为bool,经常在定义为类内私有,static bool