Реализация быстрой сортировки столбцов - 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();
- }
Объяснение кода листинга программы
Вот что получилось:
- Ввод количества строк и столбцов.
- Создание массива случайных целых чисел.
- Вывод этого массива на экран.
- Быстрая сортировка столбцов по возрастанию (отрицательное значение c).
- Быстрая сортировка столбцов по убыванию (положительное значение c).
- Ввод от пользователя символа, обозначающего операцию (либо «+», либо «-»).
- Вывод отсортированного массива на экран.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д