这道数组问题答案的代码有点看不明白

有100个正整数存放在数组中,试编一函数,要求:
(1)把所有的偶数按从小到大的顺序存放在数组的前半部;
(2)把所有的奇数按从大到小的顺序存放在数组的后半部;

我不懂的都放在注释里了

#include <stdio.h>
#define N 100

int divide(int a[],int n);

void sort(int a[],int n);

int main(){
    int a[N];
    int n,i,d;
    printf("请输入数组个数:");          //这个数组个数是干嘛用的
    scanf("%d",&n);
    printf("请输入数组:");                     
    for(i=0;i<n;i++){                             //这个循环是干嘛用的
        scanf("%d",&a[i]);
    }
    d=divide(a,n);
    sort(a,d);                       //这条语句是什么意思
    sort(a+d,n);                   //这条语句是什么意思
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

int divide(int a[],int n){
    int i=0,j=n-1;
    int temp;
    while(i<j){
        while(a[i]%2==0) i++;
        while(a[j]%2!=0) j--;
        if(i<j){
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
    return i;
}

void sort(int a[],int n){
    int i,j,temp;
    for(i=0;i<n;i++){
        for(j=0;j<n-1-i;j++){
            if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

    printf("请输入数组个数:");          //这个数组个数是干嘛用的  -- 要输入的数组元素个数。
    scanf("%d",&n);
    printf("请输入数组:");                     
    for(i=0;i<n;i++){                             //这个循环是干嘛用的 -- 根据输入的n输入数组元素
        scanf("%d",&a[i]);
    }
    d=divide(a,n);//-- 交换奇偶数位置,并返回偶数个数
    sort(a,d);                       //这条语句是什么意思 -- 排序数组中前d个元素
    sort(a+d,n);                   //这条语句是什么意思  --排序数组中d之后的元素