Реализация быстрой сортировки столбцов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите реализовать быструю сортировку столбцов не используя функцию qsort. Я вот написал, но ума неприложу, почему не работает. Оно на функции сортировки закливается, аж голова кипит(((
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<search.h>
 
void createArray(float **a, int m, int n)
{
    int i, j;
    *a = (float*) malloc(m*n*sizeof(float));
    randomize();
    for(i=0; i<m; i++)
    for(j=0; j<n; j++)
    *(*a + i*n + j) = random((101)*100)/(double)100;
}
 
void printArray(float *a, int m, int n)
{
    int i, j;
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        printf("%-8.2f ", *(a + i*n + j));
        printf("\n");
    }
}
 
void qs(float *a, int m, int n, char c)
{
    int i, j, nmin, nmax, k=0, pr;
    float min, max, temp;
    if(c=='+') //po ubyvaniyu - ishem max
    {
        for(j=0;j<m-2;j++)
        {
            do
            {
                pr=1;
                max=*(a+n);
                for(i=1+k;i<m;i++)
                {
                    if(*(a+i+n)>max)
                    {
                        max=*(a+i+n);
                        nmax=i;
                    }
                }
                temp=*(a+k+n);
                *(a+k+n)=max;
                *(a+nmax+n)=temp;
                pr=0;
            }
            while(!pr);
            k++;
        }
    }
    else
    {
        for(j=0;j<m-2;j++)
        {
            do
            {
                pr=1;
                min=*(a+n);
                for(i=1+k;i<m;i++)
                {
                    if(*(a+i+n)<min)
                    {
                        min=*(a+i+n);
                        nmin=i;
                    }
                }
                temp=*(a+k+n);
                *(a+k+n)=min;
                *(a+nmin+n)=temp;
                pr=0;
            }
            while(!pr);
            k++;
        }
    }
    return;
}
 
void main()
{
    float *a;
    int m, n, i;
    clrscr();
    vvod:
    printf("Vvedite kol-vo strok:");
    scanf("%d",&m);
    printf("\nVvedite kol-vo stolbcov:");
    scanf("%d",&n);
    if((m<1)||(n<1))
    {
        printf("\nNepravil`nyi vvod!");
        goto vvod;
    }
    createArray(&a,m,n);
    printArray(a,m,n);
    for(i=0;i<n;i++)   
    {
        if(i%2==0)//esli stolbec nechetnyi togda sortirovat` ego po ubivaniyu. Metodom BYSTROI SORTIROVKI!!!!!
        qs(a,m,i,'+');
        else
        qs(a,m,i,'-');//inache po vozrastaniyu
    }
    printf("\n\nNazhmite Enter\n\n");
    getch();
    printArray(a,m,n);
    free(a);
    getch();
}

Решение задачи: «Реализация быстрой сортировки столбцов»

textual
Листинг программы
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<search.h>
 void createArray(int **a, int m, int n)
{
        int i, j;
        *a = (int*) malloc(m*n*sizeof(int));
        randomize();
        for(i=0; i<m; i++)
        for(j=0; j<n; j++)       
       *(*a + i*n + j) = random(100)+1;
}
 
void printArray(int *a, int m, int n)
{
        int i, j;
        for(i=0; i<m; i++)
        {
                for(j=0; j<n; j++)
                printf("%-5d ", *(a + i*n + j));
                printf("\n");
        }
}
 
void qs(int *a, int m, int n, char c, int col_st)
{
        int i, j, nmin, nmax;
        int min, max, temp;
        if(c=='+') //po ubyvaniyu - ishem max
        {
                for(j=0;j<m-1;j++)
                {
                        {
                                max=*(a+n+col_st*j);
                                nmax=j;
                                for(i=1+j;i<m;i++)
                                {
                                        if(*(a+i*col_st+n)>max)
                                        {
                                                max=*(a+i*col_st+n);
                                                nmax=i;
                                        }
                                }
                                temp=*(a+n+col_st*j);
                                *(a+n+col_st*j)=max;
                                *(a+nmax*col_st+n)=temp;
                        }
                       // k++;
                }
        }
        else
        {
                for(j=0;j<m-1;j++)
                {
                        {
                                min=*(a+n+col_st*j);
                                nmin=j;
                                for(i=1+j;i<m;i++)
                                {
                                        if(*(a+i*col_st+n)<min)
                                        {
                                                min=*(a+i*col_st+n);
                                                nmin=i;
                                        }
                                }
                                temp=*(a+n+col_st*j);
                                *(a+n+col_st*j)=min;
                                *(a+nmin*col_st+n)=temp;
                        }
                     //   k++;
                }
        }
        return;
}
 
void main()
{
        int *a;
        int m, n, i;
        clrscr();
        vvod:
        printf("Vvedite kol-vo strok:");
        scanf("%d",&m);
        printf("\nVvedite kol-vo stolbcov:");
        scanf("%d",&n);
        if((m<1)||(n<1))
        {
                printf("\nNepravil`nyi vvod!");
                goto vvod;
        }
        createArray(&a,m,n);
        printArray(a,m,n);
        for(i=0;i<n;i++)   
        {
                if(i%2==0)//esli stolbec nechetnyi togda sortirovat` ego po ubivaniyu. Metodom BYSTROI SORTIROVKI!!!!!
                qs(a,m,i,'+', n);
                else
                qs(a,m,i,'-', n);//inache po vozrastaniyu
        }
        printf("\n\nNazhmite Enter\n\n");
        getch();
        printArray(a,m,n);
        free(a);
        getch();
}

Объяснение кода листинга программы

Вот что получилось:

  1. Ввод количества строк и столбцов.
  2. Создание массива случайных целых чисел.
  3. Вывод этого массива на экран.
  4. Быстрая сортировка столбцов по возрастанию (отрицательное значение c).
  5. Быстрая сортировка столбцов по убыванию (положительное значение c).
  6. Ввод от пользователя символа, обозначающего операцию (либо «+», либо «-»).
  7. Вывод отсортированного массива на экран.
  8. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы