qsort的相关总结
总结 相关 qsort
2023-09-11 14:20:37 时间
qsort的相关总结
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )
qsort位于
参数说明:
第一个参数 代表数组的首地址,通常直接写数组名即可
第二个参数 是要排序的数组个数
第三个参数 是每个元素的大小 通常sizeof(s[0])
第四个参数 是自定义比较函数 (实现升序降序)
需要注意的地方:
int compare (const void *elem1, const void *elem2 ) );
campare 这个函数名字可以任意写,但是函数的返回值类型必须是int 以及参数列表的类型必须是 const void *
No.1手动实现快速排序
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 110
using namespace std;
int a[N];
void Swap(int &a, int &b)
{//这一部分也没必要手动实现完全可以使用头文件<algorithm>中的swap函数
int temp;
temp = a;
a = b;
b = temp;
}
void QuickSort(int start, int end)
{
int k=a[start];
int i=start, j=end;
if(start >= end)
return ;
while(i != j)
{
while( i<j && a[j]>=k)
j--;
Swap(a[j], a[i]);
while( i<j && a[i]<=k)
i++;
Swap(a[i], a[j]);
}
QuickSort(start, i-1);
QuickSort(i+1, end);
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
QuickSort(0, n-1);
for(int i=0; i<n; i++)
printf("%d ", a[i]);
return 0;
}
No.2 对int数组排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int s[10000],n,i;
int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);//实现升序排列
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++) printf("%d ",s[i]);
return(0);
}
No.3 对double
注意: 要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,
只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1
#include <stdio.h>
#include <stdlib.h>
double s[1000];
int i,n;
int cmp(const void * a, const void * b)
{
return((*(double*)a-*(double*)b>0)?1:-1);//升序排列
}
int main()
{
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("%.2f ",s[i]);
return 0;
}
No.4对一维char数组中的字符排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char s[10000],i,n;
int cmp(const void *a,const void *b)
{
return(*(char *)a-*(char *)b);//升序排列
}
int main()
{
scanf("%s",s);
n=strlen(s);
qsort(s,n,sizeof(s[0]),cmp);
printf("%s",s);
return(0);
}
No.5对结构体的排序
//QAQ 其实原本只是打算查一下结构体怎么排序,没想到把一整套的东西都给复习了一遍
好吧…..不说废话了,结构体排序需要注意的是,当进行类型强制转换的时候不要直接在return 进行,别问我是怎么知道的TAT
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node
{
int no;
int data;
}STU[100];
int cmp(const void *a, const void *b)
{
struct Node *p1, *p2;//单独定义
p1 = (struct Node *)a;
p2 = (struct Node *)b;
return ((p1->data) - (p2->data));//升序排列
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
STU[i].no = i+1;
scanf("%d", &STU[i].data);
}
qsort(STU, n, sizeof(STU[0]), cmp);
for(int i=0; i<n; i++)
{
printf("%d %d\n", STU[i].no, STU[i].data);
}
return 0;
}
No.6对结构体的二重排序(指定两个变量作为排序的依据)
其实更多重的排序也是如此,不过是else if
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node
{
int no;
int data;
}STU[100];
int cmp(const void *a, const void *b)
{
struct Node *p1, *p2;
p1 = (struct Node *)a;
p2 = (struct Node *)b;
if((p1->data) != (p2->data))
return ((p1->data) - (p2->data));
else
return ((p1->no) - (p2->no));
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
STU[i].no = i+1;
scanf("%d", &STU[i].data);
}
qsort(STU, n, sizeof(STU[0]), cmp);
for(int i=0; i<n; i++)
{
printf("%d %d\n", STU[i].no, STU[i].data);
}
return 0;
}
No.7 二维字符数组的排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char s[100][100];
int cmp(const void *a, const void *b)
{
return (strcmp((char *)a, (char *)b ));
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%s", s[i]);
qsort(s, n, sizeof(s[0]), cmp);
for(int i=0; i<n; i++)
printf("%s\n", s[i]);
return 0;
}
No.8 指针数组的排序
两个地方写的特别巧妙:
1.cmp 函数中的 return (strcmp( (char )a, (char )b)) //巧妙的难以叙述
2.动态申请内存时候直接写
s[i] = (char )malloc(sizeof(char )) //666
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *s[100];
int cmp(const void *a, const void *b)
{
return(strcmp( *(char **)a, *(char **)b ));
}
int main()
{
int n;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
s[i] = (char *)malloc(sizeof(char *));
scanf("%s", s[i]);
}
qsort(s, n, sizeof(s[0]), cmp);
for(int i=0; i<n; i++)
printf("%s\n", s[i]);
return 0;
}
相关文章
- 机房收费系统之思想性总结
- 【学习总结】同一张表中有相关比较信息的情况
- 【学习总结】MySQL-关闭自动提交事务
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署
- 项目总结1——excel导出相关问题
- ArcGIS Engine中空间参照(地理坐标)相关方法总结
- Atitit timer tech定时器技术总结目录1.1. 程序语言timer dbtimer ,os tiemr 11.2. Atitit timer定时框架api 11.3. 相关技术
- Atitit 深入理解耦合Coupling的原理与attilax总结 目录 1.1. 耦合作为名词在通信工程、软件工程、机械工程等工程中都有相关名词术语。2 1.2. 所有的耦合形式可分为5类:
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- iOS 网络相关面试总结
- Computer:正则表达式技术的简介(元字符/普通字符使用字典及其方法总结大全)、相关库介绍、案例应用之详细攻略
- 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
- 用jquery写循环播放div的相关笔记 珍贵的总结 -1
- NIPS2022上的图神经网络相关论文总结
- 软件测试13年从业经验的前辈,总结的5条测试就业建议....
- 文本清洗总结
- Python常用函数总结
- Dart之字符串(String)的相关方法总结
- 【Dart学习】--Dart之正则表达式相关方法总结
- Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)
- Python知识点以及相关练习题(四万余字总结)期末Python知识点总结