算法筆記—入門篇(2)—算法初步(更新中......)

前情回顧-冒泡排序(語言篇)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;
}
相關文章
相關標籤/搜索