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