C++中的qsort、sort排序

2023-05-16

注意:

int、char、string之类的是可以之间使用>,<,==之类的进行判断,char*类型的使用strcmp就行了

而struct与vector都可以当做数组进行处理,cmp函数传递值的类型,是数组中单个元素类型所决定的。不同的是vector向量

的起始迭代位置是使用a.begin()来表示,同时也可以使用a.begin()+k,来调整迭代指针的位置

  • 使用qsort对数组进行排序(int、char、char*、struct等等)

定义qsort中的cmp函数  
//返回-1表示不需要进行交换,返回1表示需要进行交换 
//传递的参数是const void*,需要在函数体内部进行强制类型转换后,在进行返回值的判定
int cmp(const void *a,const void *b)
{
	Student *a1,*b1;
	a1 = (Student*)a;
	b1 = (Student*)b;
	if( a1->data!=b1->data ){
		return a1->data<b1->data?-1:1;//由小到大进行排序
	}else{
		return a1->number<b1->number?-1:1;  
	} 
}

调用qsort
//必须包含头文件
#include<stdlib.h>
//参数s,表示等待排序的数组的起始位置,s表示从s[0]开始,s+k表示从s[k]开始
//参数5,表示从起始位置开始,连续多少个元素参与排序
//参数sizof(Student),表示参与排序的单个元素的内存空间大小
//参数cmp,表示qsort中的cmp函数
qsort(s,5,sizeof(Student),cmp);

实例代码: 

#include<stdio.h>
#include<stdlib.h>

struct Student{
	int data;
	int number;
}s[20];

int cmp(const void *a,const void *b)//返回-1表示不需要进行交换,返回1表示需要进行交换 
{
	Student *a1,*b1;
	a1 = (Student*)a;
	b1 = (Student*)b;
	if( a1->data!=b1->data ){
		return a1->data<b1->data?-1:1;  
	}else{
		return a1->number<b1->number?-1:1;  
	} 
}

int main()
{
	for(int i=0; i<5; i++){
		scanf("%d %d",&s[i].data,&s[i].number);
	}
	
	qsort(s,5,sizeof(Student),cmp);
	
	printf("排序后:\n");
	for(int i=0; i<5; i++){
		printf("%d %d\n",s[i].data,s[i].number);
	}
	return 0;
}
  • 使用sort

定义sort中的cmp函数  
//返回true表示不需要进行交换,返回false表示需要进行交换 
//传递的参数是type,比如int,float,Student
bool cmp(Student a,Student b)
{
	if( a.data==b.data ){
		return a.number<b.number; //number由小到大返回true,不用进行交换
	}else{
		return a.data<b.data;  //data由小到大返回true,不用进行交换
	} 
}

调用sort
//必须包含头文件
#include<algorithm>
//必须包含
using namspace std;
//参数s,表示等待排序的数组的起始位置,s表示从s[0]开始,s+k表示从s[k]开始
//参数s+6,表示从s[0]位置开始,连续6个元素参与排序
//参数cmp,表示qsort中的cmp函数
sort(s,s+6,cmp);

实例代码: 

#include<stdio.h>
#include<algorithm>
using namespace std;

struct Student{
	int data;
	int number;
}s[20];

bool cmp(Student a,Student b)
{
	if( a.data==b.data ){
		return a.number<b.number; //number由小到大返回true,不用进行交换
	}else{
		return a.data<b.data;  //data由小到大返回true,不用进行交换
	} 
}

int main()
{
	for(int i=0; i<6; i++){
		scanf("%d %d",&s[i].data,&s[i].number);
	}
	
	sort(s,s+6,cmp);
	
	printf("排序后:\n");
	for(int i=0; i<6; i++){
		printf("%d %d\n",s[i].data,s[i].number);
	}
	return 0;
}

sort对vector进行排序

#include <algorithm>
#include <vector>

vector<int> vec;
//比较函数,这里的元素类型要与vector存储的类型一致
bool compare(int a,int b)
{
  return a<b; //升序排列
}

std::sort(vec.begin(),vec.end(),compare);

至于,vector内部究竟是什么数据类型,也会决定compare内部的排序

另外,若不自定义比较函数,默认是按照升序排序。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的qsort、sort排序 的相关文章

随机推荐