Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
16.11.2025
Размер:
5.4 Кб
Скачать
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int K;
int N;
int prv=0, srv=0, srvOPT=0, prvOPT=0;
int *c;
int Prandom(int range_min, int range_max){ // Функция для произвольного диапазона случайных числен
    int r = ((double)rand() / RAND_MAX) * (range_max - range_min) + range_min;
    return(r);
}
void SortInp(int **A){ // Обычный алгоритм вставкой
    int i, j, temp, aver;
    for(i=0; i<N; i++){
            j=0;
            while(j<i){
                if((*A)[i]<(*A)[j]){
                    temp=(*A)[j];
                    (*A)[j]=(*A)[i];
                    (*A)[i]=temp;
//                    printm(A, N);
                    prv+=3;
                }
                srv++;
                j++;
            }
    }
}
void SortInpOpt(int **A){ // Оптимизированный алгоритм
    int i, j, temp, aver;
    aver=0;
    for(j=0; j<N; j++){
        aver+=(*A)[j];
    }
    aver/=N;
    for(i=0; i<N; i++){
            srvOPT++;
            if(A[i]>aver){
                    j=0;
                    while(j<i){
                        if((*A)[i]<(*A)[j]){
                            temp=(*A)[j];
                            (*A)[j]=(*A)[i];
                            (*A)[i]=temp;
                            printm(A, N);
                            prvOPT+=3;
                        }
                    srvOPT++;
                    j++;
                    }
            }
            else{
                j=i;
                while((*A)[j-1]>(*A)[j]){
                    temp=(*A)[j];
                    (*A)[j]=(*A)[j-1];
                    (*A)[j-1]=temp;
                    printm(A, N);
                    prvOPT+=3;
                    srvOPT++;
                    j--;
                    }
            }
    }
}
void insert(int **a, int n, int k, int A) {
    int *q;
    int i;
    q = (int*) realloc(*a, (n+1)*sizeof(int));
    if (q==NULL) {
            printf("Ошибка! Нет памяти.");
    }
    else {
            *a = q;
            for(i=n; i>=k; i--){
                    (*a)[i+1] = q[i];
            }
            (*a)[k]=A;
    }
}
void swap(int **a, int i, int j){
    int b;
    b=(*a)[i];
    (*a)[i]=(*a)[j];
    (*a)[j]=b;
}
void swapN(int **a, int n){ // Функция 1 (для перестановки)
    int i;
    int b[2*n+1];
    b[0]=0;
    for(i=0; i<2*n; i++){
        b[i]=(*a)[i];
    }
    for(i=0; i<2*n; i++){
        if(i%2){
            (*a)[i]=b[(n+i/2)];
        }
        else{
            (*a)[i]=b[((i+1)/2)];
        }
    }
}
void printm(int **a, int n){ // Вывод
    int l;
    for(l=0; l<n; l++){
        printf("%3d", l+1);
    }
    printf("\n");
    for(l=0; l<n; l++){
        printf("%3d", (*a)[l]);
    }
    printf("\n");
    printf("\n");
}
void output_mas_file(int **a, int N){ // Функция для вывода массива в файл
    FILE *fp;
    char b[20];
    if ( (fp = fopen("test.txt","w")) == NULL ) {
            printf("Ошибка!\n");
            exit(1);
    }
    int i;
    for(i=0; i<N; i++){
            sprintf(b, "%d", (*a)[i]);
            fputs(b, fp);
            fputs(" ", fp);
    }
    fclose(fp);
}
void remove_element(int **a, int k, int N){ // Удаление одного элемента
    int i;
    for(i=(k-1); i<N-1; i++){
        (*a)[i]=(*a)[i+1];
    }
    K--;
    (*a) = (int*) realloc((*a), (N-1)*sizeof(int));
}
void add_element(int **a, int k, int N, int B){
    int i;
    (*a) = (int*) realloc((*a), (N+1)*sizeof(int));
    for(i=N; i>=k; i--){
        (*a)[i]=(*a)[i-1];
    }
    K++;
    (*a)[k-1]=B;
}
void input_mas_file(int **a){ // Функция для вывода массива из файла
    int A[100];
    char b[100];
    int ch;
    int i=0, j=0;
    FILE *fp;
    fp = fopen("test2.txt","r");
    ch = getc(fp);
    while (ch != EOF) {
            if(ch==' '){
                b[i]='\0';
                A[j]=atoi(b);
                i=0;
                j++;
            }
            b[i]=ch;
            ch = getc(fp);
            i++;
    }
    fclose(fp);
    A[j]=atoi(b);
    K=j+1;
    c = (int *) malloc((j+1) * sizeof (int));
    for(i=0; i<=j; i++){
        c[i]=A[i];
    }
}
void remove_range(int **a, int A, int B){ // Удаление элементов заданного интервала
    int i, j=0;
    for(i=0; i<K; i++){
        if(((*a)[i]>=A)&&((*a)[i]<=B)){
            j++;
        }
    }
    int *D;
    D = (int *) malloc(j * sizeof (int));
    j=0;
    for(i=0; i<K; i++){
        if(((*a)[i]>=A)&&((*a)[i]<=B)){
            D[j]=i;
            j++;
        }
    }
    for(i=0; i<j; i++){
        remove_element(a, (D[i]-i+1), K);
    }
}
int main(void){
    int j, k, i;
    K=0;
    int *dinmas, *copy_m;
    scanf("%d", &N);
    dinmas = (int *) malloc(N * sizeof (int));
    if(dinmas == NULL){
        exit(EXIT_FAILURE);
    }
    copy_m = (int *) malloc(N * sizeof (int));
    if(copy_m == NULL){
        exit(EXIT_FAILURE);
    }
//    for(j=0; j<N; ++j){
//        scanf("%d", &dinmas[j]);
//    }
        for(i=0; i<N; i++){
        dinmas[i]=Prandom(1, 100);
    }
    for(j=0; j<N; ++j){
        copy_m[j]=dinmas[j];
    }
    printm(&dinmas, N);
    SortInpOpt(&dinmas);
    printf("%d %d\n", srvOPT, prvOPT);
    SortInp(&copy_m);
    printf("\n");
    printf("%d %d\n", srv, prv);
}
Соседние файлы в папке 2 семестр