Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Различные методы сортировки и поиска си, программирование .docx
Скачиваний:
8
Добавлен:
04.01.2017
Размер:
49.33 Кб
Скачать

Метод обмена Антона

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

main (){

int *x,i,a,n=0,k=0,j,tmp;

char s[100],b[100];

FILE *in;

FILE *out;

printf ("Enter a name of an entrance file\n");

scanf ("%s",s);

in=fopen (s,"r+t");

for (;;) {

a=fscanf (in,"%d\n",&n);

if (a>0) {

k++; }

else {

break; }}

printf ("Kolichestvo elementov %d\n",k);

getch ();

x=(int*)malloc(sizeof(int)*k);

fseek(in,0,SEEK_SET);

for(i=0;i<k;i++){

fscanf (in,"%d\n",&x[i]);

printf ("x[%d]=%d\n",i,x[i]); }

for (j=k;j>0;j--) {

for(i=0;i<k;i++) {

if (x[i]>x[i+1]){

tmp=x[i];

x[i]=x[i+1];

x[i+1]=tmp; }

else break; }}

getch ();

printf ("Enter name file:\n");

scanf ("%s",b);

out=fopen (b,"w+t");

printf ("Otsortirovanye chisla:\n");

for(i=0;i<k;i++) {

fprintf (out,"%d",x[i]);

printf ("%d\n",x[i]); }

fclose (in);

fclose (out);

free (x);

getch(); }

Метод подсчета

#include<stdio.h>

#include<conio.h>

int read(char*name);

int write(char*name);

void sort();

void print();

int *arr,*sortarr;

int n;

main(){

char f1[256],f2[256];

int res;

printf("Input source file name:");

scanf("%s",f1);

printf("Input destination file name:");

scanf("%s",f2);

res = read(f1);

if (res) {

printf("Error reading file.");

getch();

return 0; }

print();

sort();

print();

res = write(f2);

if (res) {

printf("Error writing file.");

getch();

return 0;}

getch();

delete arr;

return 0;}

int read(char*name) {

FILE*f;

int tmp,i;

f = fopen(name,"rt");

if (f == NULL) return 1;

// count

for(i=0; ;i++){

if (feof(f)) break;

fscanf(f,"%d",&tmp); }

n=i;

arr = new int [n];

fclose(f);

// read

f= fopen(name,"rt");

if (f == NULL) return 1;

for(i=0;i<n ;i++) {

fscanf(f,"%d",&arr[i]); }

fclose(f);

return 0; }

int write(char*name) {

int i;

FILE *f;

f=fopen(name,"wt");

if (f == NULL) return 1;

for(i=0;i<n;i++) {

fprintf(f,"%d ",arr[i]); }

fclose(f);

return 0;}

void sort(){

int i,j,*B;

sortarr = new int [n];

B = new int [n];

for(i=0;i<n;i++) B[i]=0;

for(i=0;i<n;i++) {

for(j=0;j<n;j++) {

if(arr[i]>arr[j]) B[i]++;} }

printf("\n");

for(i=0;i<n;i++) {

for(j=i+1;j<n;j++) {

if(arr[i]==arr[j]) B[i]++; } }

for(i=0;i<n;i++) {

sortarr[B[i]]=arr[i]; }

for(i=0;i<n;i++) {

arr[i]=sortarr[i]; }

delete B,sortarr; }

void print() {

int i;

for(i=0;i<n;i++){

printf("%d ",arr[i]); }}

Метод подсчета

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <ctype.h>

#include <math.h>

#define N 20

void main() {

char **X, numb=0, k, min, Y[N], Temp[10];

int n=sqrtf(N);

struct info

{ char a;

int b; };

struct info mass[N]={' ',0};

struct info mass_sort[N]={' ',0};

if (N>n*n) n++;

for (int i=0; i<N; i++) //заполнение

{ mass[i].b=rand()%100;

mass[i].a=toascii(rand()%128);

printf (" %c %d \n", mass[i].a, mass[i].b); }

X=(char **)malloc(sizeof(char)*n);

for (int i=0;i<n; i++)

X[i]=(char *)malloc(sizeof(char)*n);

for (int i=0;i<n; i++) //разбиение на ленты

for (int j=0;j<n; j++, numb++)

{ X[i][j]=mass[numb].a;

if (numb>N-1) X[i][j]=127; }

for (int l=0; l<n; l++)//сортировка внутри каждой ленты

{ for (int i=0;i<n; i++)

{k=0;

for (int j=0;j<n; j++)

if(X[l][i]>X[l][j]) k++;

Temp[k]=X[l][i]; }

for (int i=0;i<n; i++)

X[l][i]=Temp[i];

for (int i=0;i<n; i++)

Temp[i]=0; }

for (int i=0;i<n; i++)//заполнение предыдущего в случае одинаковых ячеек

for (int j=0;j<n; j++)

if (X[i][j]==0) X[i][j]=X[i][j-1];

for (int i=0;i<n; i++)

{ for (int j=0;j<n; j++)

printf ("%c(%d)", X[i][j], X[i][j]);

printf("\n"); }

int toleft=0; //слияние

for (int j=0; j<N; j++)

{ min=X[0][0];

for (int i=0; i<n; i++)

{if (X[i][0]<min)

{min=X[i][0];

toleft=i; } }

Y[j]=min;

for (int q=0; q<n; q++)

X[toleft][q]=X[toleft][q+1];

X[toleft][n-1]=127;

toleft=0; }

for (int i=0; i<N; i++) //запись отсортированных структур в новый массив

for (int j=0; j<N; j++)

{ if (Y[i]==mass[j].a)

{ mass_sort[i].a=mass[j].a mass_sort[i].b=mass[j].b;

break; }

if (Y[i]==Y[i-1])

{ for (j+1; j<N; j++)

if (Y[i]==mass[j].a) { mass_sort[i].a=mass[j].a; mass_sort[i].b=mass[j].b;}}}

for (int i=0; i<N; i++)

printf (" %c %d \n", mass_sort[i].a, mass_sort[i].b);

getch(); }