sort对结构体数组排序(php数据结构与算法(PHP描述) 快速排序 quick sort)
本文目录
- php数据结构与算法(PHP描述) 快速排序 quick sort
- C++程序题结构体和sort排序问题E:进步最快
- c++ 如何用sort为struct排序
- 对结构体sort排序说引用非法内存 sort(p+1,p+n+1,cmp);(p是已经读好的结构体数组,从p[1]到p[n])
- 如何给字符串排序
- 学生成绩管理系统
- 在vba中,使用union选择不同单元格,然后组成数组,结果数组里元素的顺序和希望的不一样希望大神指教
- sort排序的时候遇到两个数相等怎么处理
- c++以一个数组为关键字对多个数组排序
- c++中数组如何排序
php数据结构与算法(PHP描述) 快速排序 quick sort
复制代码代码如下:《?php/***快速排序quicksort***/functionsort_quick($arrData){if(empty($arrData)||!is_array($arrData))returnfalse;$flag=$arrData;$len=count($arrData)-1;if($len==0)return$arrData;//如果只有一个数据的数组直接返回$arrLeft=array();$arrRight=array();$len_l=0;$len_r=0;for($i=1;$i《=$len;$i++){if($arrData《$flag){$arrLeft=$arrData;//小于的放左边$len_l++;}else{$arrRight=$arrData;//大于等于的放右边$len_r++;}}//合并数组$arrResult=array();if($len_l){$arrLeft=sort_quick($arrLeft);for($i=0;$i《=$len_l-1;$i++){$arrResult=$arrLeft;}}$arrResult=$flag;$len_l++;if($len_r){$arrRight=sort_quick($arrRight);for($i=0;$i《=$len_r-1;$i++){$arrResult=$arrRight;$len_l++;}}echo"==",$flag,"==========================================《br/》";echo"data:",print_r($arrData),"《br/》";echo"filterleft:",print_r($arrLeft),"《br/》";echo"filterright:",print_r($arrRight),"《br/》";echo"return:",print_r($arrResult),"《br/》";return$arrResult;}//$list=array(4,3,2,1,5,7,3,7);$list=array(4,51,6,73,2,5,9,33,50,3,4,6,1,4,67);$list=sort_quick($list);echo"《pre》";print_r($list);
C++程序题结构体和sort排序问题E:进步最快
我平时有刷类似算法题,如图leetcode上我的记录。此题的思想很简单:原编号就是原排名,自己写个比较函数用sort进行索引排序!这样就能轻松比较排名变化。
程序如下,有详细注释
#include《stdio.h》#include《iostream》#include《vector》#include《algorithm》using namespace std;typedef union G_sort{char grade;int id;}G_sort;bool greater(const G_sort &a, const G_sort &b) {return a.grade;//成绩(高8位)}int main() {//输入int n;cin 》》 n;//第一行一个整数n,表示学生总数。vector《G_sort》 grade(n);//表示每个学生的 编号(高24位)|成绩(低8位)for (int i = 0; i 《 n; i++) {//n ≤ 100, 000scanf("%d", &grade);//成绩(高8位)//cin 》》 grade;★这种输入会出错grade.id |= i;//编号(低24位)}//排序sort(grade.begin(), grade.end(), greater);//根据学号排序int d_sort = 0, now_sort;//排名上升多少,现排名for (int i = 0; i 《 n; i++) {int d = (grade.id & 0xffffff) - i;//原排名-现排名if (d 》 d_sort) {//若两位同学名次上升幅度相同,输出名次靠前的,也就是编号较小的。(不能取=)d_sort = d;now_sort = i + 1;//注意!下标从0数起 比排名少1}}//输出/* //16进制查看 grade 数据for (int i = 0; i 《 n; i++) {printf("%x\n", grade.id);}*/cout 《《 now_sort 《《 endl 《《 now_sort+ d_sort 《《 endl;system("pause");return 0;}
c++ 如何用sort为struct排序
只要你的结构体定义好了operator《 operator》和operator==与operator!=就可以用sort来给结构体数组排序了。
对结构体sort排序说引用非法内存 sort(p+1,p+n+1,cmp);(p是已经读好的结构体数组,从p[1]到p[n])
楼上是sx,楼主别理他。stl默认是小于号排序,严格小于。自定义的cmp也该是当x、y相等时返回0才行,否则排序无法退出 推荐写法如下:struct pii{int a,b;};bool cmp(const pii &x,const pii &y){return x.b《y.b;} sort(1+p,1+n+p,cmp);如果按以下写法,大多数编译器下会更快(内联)bool operator《(const pii &x,const pii &y){return x.b《y.b;} sort(1+p,1+n+p);
如何给字符串排序
结构体 捆绑 弄个结构体数组 ............... 方法一 结构体数组排序/////////////////////////////////////////// C-Free 4.1// MinGW 3.4.5// veket的小号/////////////////////////////////////////#include 《stdio.h》#include 《string.h》typedef struct data{ char s; int x; int y;}DATA;int main(){ DATA d; DATA temp; int i; int j; strcpy(d.s, "ASD"); d.x = 25; d.y = 4; strcpy(d.s, "ZXC"); d.x = 36; d.y = 9; strcpy(d.s, "QWE"); d.x = 10; d.y = 2; printf("Array before sort:\n"); for(i=0;i《3;i++) { printf("%s\t%d\t%d\n", d.y); } for(i=0;i《2;i++) { for(j=i+1;j《3;j++) { if(d.x) { strcpy(temp.s, d.s); temp.x = d.x; temp.y = d.y; strcpy(d.s); d.x; d.y; strcpy(d.s, temp.s); d.x = temp.x; d.y = temp.y; } } } printf("\n\nArray after sort:\n"); for(i=0;i《3;i++) { printf("%s\t%d\t%d\n", d.y); } return 0;}方法二 结构体不排序 建个指针数组 每个元素 依次指向 结构体数组的元素然后 对指针数组 进行排序 #include 《stdio.h》#include 《string.h》typedef struct data{ char s; int x; int y;}DATA;int main(){ DATA d; DATA *p; DATA *temp; int i; int j; strcpy(d.s, "ASD"); d.x = 25; d.y = 4; strcpy(d.s, "ZXC"); d.x = 36; d.y = 9; strcpy(d.s, "QWE"); d.x = 10; d.y = 2; printf("Array before sort:\n"); for(i=0;i《3;i++) { p; printf("%s\t%d\t%d\n", p-》y); } for(i=0;i《2;i++) { for(j=i+1;j《3;j++) { if(p-》x) { temp = p; p; p = temp; } } } printf("\n\nArray after sort:\n"); for(i=0;i《3;i++) { printf("%s\t%d\t%d\n", p-》y); } return 0;}
学生成绩管理系统
#include《stdio.h》#define N 40#include《string.h》#include《conio.h》#include《stdlib.h》struct student{ long num; char name; float score; float sum;}st;FILE *fp;void menu(){ printf(" \t****************************************\n"); printf(" \t\t1--------------查询\n"); printf(" \t\t2--------------排序\n"); printf(" \t\t3--------------插入\n \t\t4--------------删除\n"); printf(" \t\t0--------------退出\n"); printf(" \t****************************************\n");}void input(struct student s,int *n){ printf("请输入您所要添加的学生数目\n"); int x,i,j,b,flag=0; scanf("%d",&x); b=*n+x; for(i=*n+1;i《=b;i++) { flag=1; printf("请输入学生学号:\n"); scanf("%ld",&s.num); for(j=1;j《i;j++) if(s.num&&i》1) { printf("输入有误\n");flag=0;i--;b--;break;} if(flag) { printf("请输入学生姓名:\n"); scanf("%s",s.name); printf("请依次输入该生高数、英语读写、英语听说、计算计导论、程序设计(一)的分数:\n"); for(j=1;j《=5;j++) scanf("%f",&s); } } *n=b;if(flag) printf("添加成功\n"); printf("输入完毕!按任意键返回主菜单!"); getch();}void Delete(struct student s,int *n){ printf("请输入您所要删除的学生的姓名\n"); char m;int j; scanf("%s",m); for(j=1;j《=*n;j++) if(strcmp(s.name,m)==0) { *n=*n-1; for(;j《=*n;j++) s; break; } printf("删除成功!\n"); printf("输入完毕!按任意键返回主菜单!"); getch();}void find(struct student s,int n){ long b=0;char c; printf(" \t****************************************\n"); printf(" \t\t1.1----------按学号查询\n"); printf(" \t\t1.2----------按姓名查询\n"); printf(" \t\t1.3----------按成绩查询\n"); printf(" \t****************************************\n"); int j,e,flag=0; float soc; scanf("%s",kk); if(strcmp(kk,"1.1")==0){ printf("请输入学生学号\n"); scanf("%s",c); { for(j=0,e=strlen(c);j《e;j++) b=b*10+c-48; printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n"); for(j=1;j《=n;j++) if(b==s.num) { flag=1; printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum); } if(!flag) printf("未找到相关学生信息\n"); } } else if(strcmp(kk,"1.2")==0) { printf("请输入学生姓名\n"); scanf("%s",c); printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n"); for(j=1;j《=n;j++) if(strcmp(s.name,c)==0) { flag=1; printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum); } if(!flag) printf("未找到相关学生信息\n"); } else if(strcmp(kk,"1.3")==0) { printf("请输入学生分数\n"); scanf("%f",&soc); printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n"); for(j=1;j《=n;j++) if(s.sum==soc) { flag=1; printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum); } if(!flag) printf("未找到相关学生信息\n"); } else printf("输入有误.....\n"); printf("查找完毕!按任意键返回主菜单!"); getch();}void sort(struct student s,int n){ int j,f,g,h; for(j=1;j《=n;j++) for(f=1,s.sum=0;f《=5;f++) s; struct student temp; for(j=1;j《n;j++) for(g=1;g《=n-j;g++) if(s.sum ) { temp=s; s; s=temp; }}void print1(struct student s,int n){ printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n"); for(;n》0;n--) printf("%ld\t%s\t%-0.2f\t%0.2f\t %0.2f\t %0.2f\t %0.2f\t %0.2f\n",s.sum ); printf("输出完毕!按任意键返回主菜单!"); getch();}void dataSave() /*文件保存*/{ int i; fp=fopen("student.dat","w"); for(i=0;i《N;i++) if(fwrite(&st,sizeof(st),1,fp)!=1) { fclose(fp); /*关闭文件指针*/ printf("file write error\n"); getch(); }}int main(){ menu(); int x,n=0; while(scanf("%d",&x)!=EOF&&x!=0) { switch(x) { case 1:find(st,n);break; case 2:sort(st,n);print1(st,n);break; case 3:input(st,&n);sort(st,n);dataSave();break; case 4:Delete(st,&n);dataSave();break; default:printf("Input error!\n"); } system("cls"); /*清屏*/ menu(); } return 0;
在vba中,使用union选择不同单元格,然后组成数组,结果数组里元素的顺序和希望的不一样希望大神指教
## 结构体与sort排序的完美结合 ## 各位正在学习语言的小伙伴们大家好,本期栏目,小编将带领正在学习结构体的同学,一起深入地学习他们! 在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C++语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。 C++中定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type)。还有空类型:关键字void,不能用于普通变量的声明和普通的操作,只能用于指针型变量,函数返回值和函数参数。这些统称为预定义类型。 另一类为自定义类型:数组、结构体(struct)、联合体(union)、枚举(enum)。
sort排序的时候遇到两个数相等怎么处理
sort排序的时候遇到两个数相等, 序列里保留这两个数,并且不交换这两个数的位置。如果你有附加条件,例如这组数的每个数都有一个量与它有联系(例如id), 对相等的两个数,考虑它们的id大小进一步sort,那就要做另一次有条件的处理。例如 网站IP 地址 排序202.108.22.44 202.108.22.45202.18.122.45。。。要分4个部分来排序或做处理后排序20210802244 2021080224520201812245。。。
c++以一个数组为关键字对多个数组排序
最傻瓜的办法就是单用一个数组d,内容初始化成0 1 2 3,然后sort(d, d + 4, ; });这样虽然a b c并没直接被排序,但是以c作为索引就可以得到a b的新顺序
c++中数组如何排序
//排序是一种极其重要的算法。常见的排序有冒泡排序(O(n^2))、选择排序(O(n^2))、插入排序(O(n^2))、快速排序(O(nlog(n)))、堆排序(O(nlog(n)))、归并排序(O(nlog(n)))、桶排序(O(n))等***隐藏网址***int temp=0;int a={7,8,5,4,3,2,6,9,0,1};for(int n=0;n《10;++n){ cout《《a《《endl;}//输出,仅用来测试for(int i=0;i《9;++i)//只需要冒泡9个数最后一个就已经有序了 for(int j=0;j《9-i;++j)//j的取值需《10-i-1;为何-1,//下面的下标含有j+1,所以要-1防止下标越界,此外,根本原因是因为,2个数比较,第一次开始比较时候,所有数只需比较N-1次。 if(a) { temp=a; a; a=temp; }for(int n=0;n《10;++n){ cout《《a《《endl;}//输出***隐藏网址******隐藏网址******隐藏网址***//快排在C++中有一种直接调用的方法#include《algorithm》//...int a,i,j;//...sort(a+i,a+j);//这里i《=j,表示将数组a从a进行快排***隐藏网址***//堆在C++中也有一种直接调用的方法,包含在《algorithm》库中,具体函数有make_heap,push_heap,pop_heap,sort_heap等//另外还可以通过《set》库来充当堆,实现如下:#define REP(start,end) for(int I=start;I《=end;I++)#include《set》#include《cstdio》using namespace std;multiset《int》 tree;int n,x;int main(){ scanf("%d",&n); REP(1,n) { scanf("%d",&x); tree.insert(x); } REP(1,n) { printf("%d\n",*tree.begin()); tree.erase(tree.begin()); } return 0;}//但要注意的是,《set》库并不是通过堆实现的,而是一种叫做“红黑树”的数据结构
更多文章:
电脑版办公软件word免费下载(电脑如何下载免费的word2010)
2024年6月29日 01:11
三星galaxy s10(三星S10有什么新功能、特色功能、亮点)
2024年8月21日 20:56
应用宝下载安装2022最新版(2022应用宝什么时候再次上线)
2024年7月27日 12:21