Реализация быстрой сортировки столбцов - 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).
- Ввод от пользователя символа, обозначающего операцию (либо «+», либо «-»).
- Вывод отсортированного массива на экран.
- Завершение работы программы.