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

Метод выбора

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <locale.h>

void main()

{ setlocale(LC_ALL,"Rus");

const int N=9, n=3, k=3;/*N -количество строк, n -количество элементов в ключе, k -количество лент*/

int L[N][n],L_new[N][n],i,j,q,p,h,l,dop,min[n],key,sch[k];/*L[N][n] - исходная лента L_new[N][n] - получаемая лента i,j,q,p,l - счетчики h,dop,key вспомогательные переменные min[n] - вспомогательный массив для поиска минимального элемента sch[k]- счетчики лент*/

for(i=0;i<N;i++)//ввод ленты

{ printf("\nВведите ленту №%d:\n",i);

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

{printf("Введите элемент %d: ", j);

scanf("%d",&L[i][j]);}}

/*сортировка каждой из лент методом выбора*/

for(q=0;q<k;q++)//счетчик по количеству лент

for(p=q*N/k;p<(q*N/k+N/k);p++)//счетчик элементов нужной ленты

{for(l=0;l<n;l++)//инициализация массива мин для сравнения min[l]=777;

for(i=p;i<(q*N/k+N/k);i++)//сортировка методом выбора

{key=0 ; for(j=0;j<n;j++)//нахождение минимального ключа {if((key!=1)&&(L[i][j]<min[j]))

{for(l=0;l<n;l++) min[l]=L[i][l]; h=i;//запоминание номера минимальной ленты key=1;}

else if((key!=1)&&(L[i][j]==min[j])) key=0;

else

key=1;}}

for(j=0;j<n;j++)//обмен элементов в ленте

{dop=L[h][j];

L[h][j]=L[p][j]; L[p][j]=dop;}}

for(i=0;i<k;i++)//инициализация счетчиков лент

sch[i]=i*N/k;

for(q=0;q<N;q++)//счетчик по количеству элементов

{for(l=0;l<n;l++)//инициализация массива мин для сравнения

min[l]=777;

for(p=0;p<k;p++)//счетчик по количеству лент

{ key=0;

for(j=0;j<n;j++)//слияние лент

{if((sch[p]<((p+1)*N/k))&&(key!=1)&&(L[sch[p]][j]<min[j]) { for(l=0;l<n;l++)

min[l]=L[sch[p]][l];

h=p;

key=1;}

else if((sch[p]<((p+1)*N/k))&&(key!=1)&&(L[sch[p]][j]==min[j])) key=0; else key=1;}}

for(j=0;j<n;j++)//запись нужной строки в нужный массив

L_new[q][j]=L[sch[h]][j];

sch[h]++;}

for(i=0;i<N;i++)//вывод получившегося массива

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

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

printf("\n");}

getch();}

Гаммирование

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <time.h>

#include <conio.h>

#include <locale.h>

const int N=32;

char* code(char* str, int* mass)

{int count = 0;

char *res = (char*)malloc(strlen(str)*sizeof(char));

for(int i=0;i<=strlen(str);i++)

res[i]=str[i];

for(int i = 0; i < strlen(res); i++, count++)

{if(count == (N-1))

count = 0;

res[i] = ((str[i])^mass[count]);}

return res;}

int main()

{setlocale(LC_ALL,"Rus");

srand (time(NULL));

int mass[N];

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

mass[i] = rand()%100;

char file[100]="",str[100];

printf("Введите имя файла: ");

scanf("%s",file);

FILE *fp=fopen(file,"r+");

fgets(str,100,fp);

fclose(fp);

printf("\nИсходная строка: %s",str);

printf("\nЗакодированная строка: %s",code(str, mass));

printf("\nРаскодированная строка: %s",code(code(str, mass),mass));

getch();}

Обход смешанный в дв дереве

void obhod(Tree *root) { if(root->left) obhod(root->left); printf("\n%d",root->key); if(root->right) obhod(root->right); }

Блочный поиск

#include<stdio.h>

#include<conio.h>

#include<string.h>

int read(char*name);

int write(char*name);

int search(char* s);

int search1(int i1, int i2,char* s );

int directsearch(int i1, int i2,char* s);

void sort();

void print();

char **arr,**sortarr;

int *positions;

int n,k=5;

main()

{ char f1[256],f2[256],e[1024];

int res,i, sortedindex,originalindex;

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();

for(;;) {

printf("\n\nInput value (0 for exit)");

scanf("%s",e);

if (strcmp(e,"0") == 0) break;

sortedindex=search(e);

if(sortedindex!=-1) {

originalindex = positions[sortedindex];

printf("\nvalue #%d,%s",originalindex,arr[sortedindex]); }

else printf("\nValue not found");

} res = write(f2);

if (res)

{printf("Error writing file.");

getch();

return 0;}

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

delete arr;

delete positions;

return 0;}

int read(char*name)

{FILE*f;

char *tmp=NULL;

int i,len;

tmp = new char [1024];

f = fopen(name,"rt");

if (f == NULL) return 1;

// count

for(i=0; ;i++)

{ if (feof(f)) break;

fscanf(f,"%s",tmp); }

n=i;

arr = new char* [n];

positions = new int [n];

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

fclose(f);

//read

f= fopen(name,"rt");

if (f == NULL) return 1;

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

{fscanf(f,"%s",tmp);

len=strlen(tmp);

arr[i]= new char [len+1];

strcpy(arr[i],tmp); }

delete tmp;

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,"%s ",arr[i]); }

fclose(f);

return 0;}

int search(char* s)

{ int res;

res=search1(0,n-1,s);

return res;}

int search1(int i1, int i2,char* s )

{int res,i;

int indbeg;

int indend;

if(i2-i1<k) return directsearch(i1,i2,s);

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

{indend=(i2-i1+1)*(i+1)/k-1;

indbeg=(i2-i1+1)*(i)/k;

res=strcmp(arr[indend],s);

if(res==0) return indend;

else if (res > 0) return search1(indbeg,indend,s);}

return -1;}

int directsearch(int i1, int i2,char* s)

{ int i;

for(i=i1;i<=i2;i++)

{if(strcmp(s,arr[i])==0) return i;

}return -1;

}void sort(){

int i,j,*B;

sortarr = new char* [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(strcmp(arr[i],arr[j])>0) 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];

positions[B[i]] = i;}

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

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

delete sortarr,B;}

void print()

{ int i;

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

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