前情回顧-冒泡排序(語言篇)node
冒泡排序是排序中最基本的一種方法,雖然在寫題時咱們通常不會去使用它,但我以爲了解冒泡排序算法的實現原理確實很是必要的。算法
冒泡排序的本質在於交換,即每次經過交換的方式把當前剩餘元素的最大值移動到一端,當剩餘元素爲0時,排序結束。數組
1.簡單選擇排序函數
① 數組A中元素A[1]~A[N],spa
② 令 i 從 1 到 n 進行 n 趟操做,每趟操做從A[i]~A[N]中選出一個最小的元素,code
③ 令其與待排序部分的第一個元素A[i]交換,最後全部元素有序。blog
#include<stdio.h> int main(){ int a[100]; int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int min=9999; for(int i=0;i<n;i++){ int mi; for(int j=i;j<n;j++){ if(a[j]<min){ min=a[j]; mi=j; } } int temp=a[i]; a[i]=a[mi]; a[mi]=temp; } for(int i=0;i<n;i++){ printf("%d ",a[i]); } return 0; }
2.直接插入排序排序
前一部分爲有序數列,後一部分爲無序數列,字符串
把無序部分的第一個元素放入有序部分,找到合適的位置,string
這個過程當中有序部分可能須要進行後移操做,直至操做n-1趟。
#include<stdio.h> int main(){ int n; int a[100]; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=2;i<=n;i++){ int temp=a[i],j=i; while(j>1&&temp<a[j-1]){ a[j]=a[j-1]; j--; } a[j]=temp; } for(int i=1;i<=n;i++){ printf("%d ",a[i]); } return 0; }
3.sort排序(排序神器)
sort()函數是C++中用於排序的一個函數,比較高效。
如何使用sort排序:
①需加頭文件#include<algorithm>和using namespace std;
②sort(首元素地址,尾元素的下一個地址,比較函數(可選))
sort函數的參數有三個,其中前兩個是必填的,比較函數能夠根據須要填寫。
#include<stdio.h> #include<algorithm> using namespace std; int main(){ int a[6]={9,4,2,5,6,-1}; sort(a,a+4);//將a[0]-a[3]從小到大排序 for(int i=0;i<4;i++){ printf("%d ",a[i]); } printf("\n"); sort(a,a+6); for(int i=0;i<6;i++){ printf("%d ",a[i]); } return 0; }
如何實現比較函數cmp:
sort函數默認是將數組進行從小到大的排序,若是想要從大到小排序,則須要使用比較函數cmp來實現。
#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int a,int b){ return a>b; } int main(){ int a[6]={9,4,2,5,6,-1}; sort(a,a+4,cmp);//將a[0]-a[3]從大到小排序 for(int i=0;i<4;i++){ printf("%d ",a[i]); } printf("\n"); sort(a,a+6,cmp); for(int i=0;i<6;i++){ printf("%d ",a[i]); } return 0; }
結構體數組的排序:
能夠按照結構體內的元素的大小進行排序
#include<stdio.h> #include<algorithm> using namespace std; struct node{ int x,y; }ssd[10]; bool cmp(node a,node b){ return a.x>b.x;//按照x從大到小排序 } int main(){ ssd[0].x=2; ssd[0].y=2; ssd[1].x=1; ssd[1].y=3; ssd[2].x=3; ssd[2].y=1; sort(ssd,ssd+3,cmp); for(int i=0;i<3;i++){ printf("%d %d\n",ssd[i].x,ssd[i].y); } return 0; }
若是想先按x從大到小排序,若是x相等,則按y從小到大排序(二級排序),則cmp的寫法爲:
bool cmp(node a,node b){ if(a.x!=b.x) return a.x>b.x;//按照x從大到小排序 else return a.y<b.y; }
4.複雜的結構體排序:
本身嘗試了幾回,沒有經過所有樣例,id我本來採用long long 存儲,沒法經過,只能用字符串。
題目大意:
n個考場,每一個考場m個學生,輸入學生學號和成績,進行考場內排序和總的排序。輸出內容:學號,總名次,考場號,考場內名次
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct student{ char id[15]; int loc_num; int loc_rank; int score; }stu[30010]; bool cmp(student a,student b){ if(a.score!=b.score) return a.score>b.score; else return strcmp(a.id,b.id)<0; } int main(){ int n;//n爲考場數 int m;//m爲考場內人數 int k=0;//k爲考生總數 scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&m); for(int j=0;j<m;j++){ scanf("%s %d",stu[k].id,&stu[k].score); stu[k].loc_num=i; k++; } sort(stu+k-m,stu+k,cmp); stu[k-m].loc_rank=1; for(int j=k-m+1;j<k;j++){ if(stu[j].score==stu[j-1].score){ stu[j].loc_rank=stu[j-1].loc_rank; }else{ stu[j].loc_rank=j+1-(k-m); } } } printf("%d\n",k); sort(stu,stu+k,cmp); int r=1; for(int i=0;i<k;i++){ if(i>0&&stu[i].score!=stu[i-1].score) r=i+1; printf("%s ",stu[i].id); printf("%d %d %d\n",r,stu[i].loc_num,stu[i].loc_rank); } return 0; }