Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int sort (int *, int );
- void swap (int &, int &);
- void print(int *, int );
- extern "C" {
- void __stdcall _swap( int *, int * );
- int __stdcall _sort( int *, int );
- }
- ////////////////////////////////////////////////////////
- int main() //
- {
- int mas[99] = {5, 11, 2, 1117, 6, 34, 91, 1, 7},
- n = _sort (mas, 9);
- printf("Number of permutations = %d \n", n);
- print(mas, 9);
- return 0;
- }
- // stdcall-функция может как угодно менять eax, ecx и edx,
- // не восстанавливая их потом.
- // - - - - - - - - - - - - - - - -
- // 1) swap - Функция
- // 2) Используем аналогию: по одному торту в каждой руке.
- // Чтобы их поменять местами, потребуется стол.
- //
- // 10) Кол-во перестановок узнаём.
- ////////////////////////////////////////////////////////
- void swap(int &n1, int &n2) //
- {
- int n3 = n1;
- n1 = n2;
- n2 = n3;
- }
- ////////////////////////////////////////////////////////
- int sort(int *p, int n) //
- {
- int nF, nCount = 0; // Флаг
- L_01: nF = 0;
- for(int i = 0; i < n-1; i++)
- {
- if( p[i] > p[i+1] ) { nF = 1; // = 1, если требуется перестановка
- nCount ++;
- // swap( p[i], p[i+1] ); }
- _swap( &p[i], &p[i+1] ); }
- }
- if(nF) goto L_01;
- return nCount;
- }
- ////////////////////////////////////////////////////////
- void print(int *p, int n) //
- {
- for(int i = 0; i < n; i++) {
- printf("%d, ", p[i]);
- }
- printf("\n");
- }
- // Пузырьковая сортировка на Си — это метод сортировки данных, который
- // работает путём сравнения соседних элементов и обмена их местами,
- // если необходимо. Алгоритм состоит из нескольких проходов по массиву,
- // каждый из которых улучшает порядок элементов.
- // FASM :
- include 'win32a.inc'
- format MS COFF
- public _sort as '__sort@8'
- public _swap as '__swap@8'
- section '.text' code readable executable
- ; Передаём указатели на элементы массива, которые следует
- ; поменять местами.
- ;/////////////////////////////////////////////////////////////
- proc _swap p1, p2 ;//
- mov esi , [ p1]
- mov eax , [esi]
- mov edi , [ p2]
- mov edx , [edi]
- mov [esi], edx
- mov [edi], eax
- ret
- endp
- ; Специально для функции sort, чтобы упростить создание кода.
- ; В p адрес младшего из 2-х элементов
- ;////////////////////////////////////////////////////////////
- proc swap p ;//
- push esi
- push edi
- ; - - - - - - - - -
- mov esi , [ p ] ; Адрес 1-го торта
- mov edi , [ p ]
- add edi , 4 ; Адрес 2-го торта
- mov eax , [esi] ; 1-й торт в левую руку (в eax)
- cmp eax , [edi] ; Сравним 2 торта
- jle L_01 ; Если содержимое eax < ,то выходим
- mov edx , [edi] ; edx, как стол используем
- mov [esi], edx
- mov [edi], eax
- mov [ nF], 1 ; Флаг помнит про перестановку
- inc [nCount] ; Счётчик перестановок увеличиваем
- ; - - - - - - - - -
- L_01: pop edi
- pop esi
- ret
- endp
- ; stdcall-функция может как угодно менять eax, ecx и edx,
- ; не восстанавливая их потом.
- ;/////////////////////////////////////////////////////////////
- proc _sort p, n ;//
- dec [n]
- L_05: mov esi , [p]
- mov ecx , [n] ; число итераций
- mov [ nF], 0
- L_02: push esi
- call swap
- add esi , 4
- loop L_02 ; Команда цикла, переход на новый
- cmp [nF], 1
- jz L_05
- mov eax , [nCount]
- ret
- endp
- section '.data' data readable writeable
- ;------------------------------------------------------------- Создание переменных:
- arr dd 4 dup(333)
- nF dd 0
- nCount dd 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement