Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Assembler Вывод на экран длины введенной с клавиатуры строки https://www.cyberforum.ru/asm-beginners/thread389769.html
Граждане! Выручайте! Нужно разработать программу перевода ввода и вывода чисел в различных системах счисления, а также работы с числами в ассемблерных программах. Вывести на экран длину введенной с...
Assembler Деление двух целых пятизначных чисел(целая и дробная части)
Составить и отладить программу на ассемблере для нахождения результата деления двух целых пятизначных чисел, представленных в десятичном формате. Числа вводятся с клавиатуры. Результат вывести на...
Assembler Разбить число на цифры(тетрады)
Как на Ассемблере для процессора 80х86 разбить число на тетрады и каждую тетраду занести в отдельный регистр. Число 3EB7.
Assembler Максимальный элемент массива а(10) ... написать программу на assembler под Dos которая находит максимальный элемент массива а(10) меняет местами его с третьим по величине нечетным элементом с четным номером https://www.cyberforum.ru/asm-beginners/thread389491.html
Assembler программа должна выводить содержимое текстового файла на экран https://www.cyberforum.ru/asm-beginners/thread389487.html
программа должна выводить содержимое текстового файла на экран
Assembler Запись строки в обратной последовательности
Ребята! Помогите новичку. Нужно разработать программу, ввода строковых данных с клавиатуры. Произвести запись строки в обратной последовательности. Очень надеюсь на Вас!
Assembler Помогите сделать вывод на екран масива среднеарифмитического и минимального значения
.model small .stack 100h .data arr db 11,2,13,44,32,100,8,97,9 ;Массив. l=$-arr buf label byte ;Буфер для ввода. max db 80 ;Макс. число вводимых символов. lnt ...
Assembler Минимальный среди кратных 3 элементов массива а(15)поменять местами с первым элементом возрастающей последовательности м минимальный среди кратных 3 элементов массива а(15)поменять местами с первым элементом возрастающей последовательности массива https://www.cyberforum.ru/asm-beginners/thread389364.html
Assembler Через командную строку передать имя каталога и удалить этот каталог. https://www.cyberforum.ru/asm-beginners/thread389168.html
Здравствуйте, помогите пожалуйста с задачкой, задание в топе... Обработку командной строки необходимо организовать в виде макроса или процедуры. Пример: mov si,80h mov al,es: cmp al,0...
Assembler Заменить в строке встречающийся символ "a" на символ "k" Ввести строку символьных данных, задавая буфер равный 40 байт. Заменить в этой строке встречающийся символ "a" на символ "k". Выдать полученную строку символов в первую строку экрана, начиная с 12... https://www.cyberforum.ru/asm-beginners/thread389163.html
Jin X
cmpxchg16b
5154 / 1635 / 188
Регистрация: 14.12.2014
Сообщений: 3,078
Записей в блоге: 11
Завершенные тесты: 3
11.11.2017, 13:32 0

Программа для сортировки любого массива

11.11.2017, 13:32. Просмотров 46580. Ответов 14
Метки (Все метки)

Ответ

Решил всё же добавить в виде сообщений тексты исходников ещё некоторых (но не всех) модулей (к сожалению, в одной сообщение они не помещаются):

Модуль умной быстрой сортировки для массивов с двойными элементами IQSortS2.inc:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
;##################################################
;##                                              ##
;##        [ Asm7x.List ][ IQSortS2.inc ]        ##
;##                                              ##
;##            -= Smart Quick Sort =-            ##
;##         (for double element arrays)          ##
;##                                              ##
;##           Умная быстрая сортировка           ##
;##     (для массивов с двойными элементами)     ##
;##                                              ##
;##           [ v1.00 :: 11.11.2017 ]            ##
;##              MASM/TASM (16 bit)              ##
;##                                              ##
;##     (c) 2017 by Jin X (jin.x@sources.ru)     ##
;##             http://xk7.ru/p/a/i              ##
;##                                              ##
;##################################################
 
IFDEF           ??Version       ; TASM
  LOCALS
ENDIF
 
IQSortS2_ver    =       100h                    ; версия данного модуля (word: старший байт - целая часть, младший - дробная)
 
; !!! В данном модуле используется ЗНАКОВОЕ сравнение значений и сортировка по ВОЗРАСТАНИЮ (от меньшего к большему)
; !!! Для замены на БЕЗзнаковое сравнение или сортировку по УБЫВАНИЮ необходимо изменить соответствующие инструкции, помеченные в комментариях символами ***
 
; IQSortInsThrs = порог использования сортировки вставками (когда кол-во элементов меньше указанного здесь значения) [минимум 2; по умолчанию 16]
;   Если кол-во элементов (на первой или последующей итерации) больше или равно значению IQSortInsThrs, используется быстрая сортировка, иначе
;   используется сортировка вставками - это немного ускоряет процесс (при правильном выборе значения IQSortInsThrs, например, при значении по умолчанию)
;   и уменьшает глубину рекурсии, защищая стек от переполнения
IQSortInsThrs   =       16
 
; IQSortMaxStk = максимальный размер стека в байтах, который допустимо использовать процедуре IQSort (включая call из основного кода) [минимум 12; по умолчанию 128]
;   Каждый уровень вложенности использует 4 байта (2 слова) стека (первый уровень - до 4-х слов, последний может использовать на 2 слова больше, итого минимум 12 байт),
;   т.о. 128 байт позволяют организовать до 30 уровней рекурсии, что достаточно даже для очень больших массивов
IQSortMaxStk    =       128
 
;-----------------------------------------------------------------------------------------------------------------------
 
;-- IQSortDE: Умная БЫСТРАЯ СОРТИРОВКА массива (комбинированным методом) -----------------------------------------------
; > Входные данные: DS:DX = адрес массива, CX = кол-во элементов массива (знаковое значение)
; > Результат: отсортированный массив (по тому же адресу)
; Элементы массива содержат по 2 значения типа WORD:
;   * первое слово содержит опорное значение (по которому происходит сравнение),
;   * второе слово - связанные с элементом данные (обычно это указатель на данные);
;     при сортировке связанные данные переносятся вместе с опорными значениями
; Если кол-во элементов (на первой или последующей итерации) больше или равно значению IQSortInsThrs, используется быстрая сортировка,
;   иначе используется сортировка вставками
; Сортировка вставками также используется, если для следующего уровня рекурсии потребуется более IQSortMaxStk байт стека в общем сложности
; Процедура изменяет регистры AX, BX, CX, DX, SI, DI, сохраняет BP и сегментные регистры
IQSortDE        PROC
                dec     cx
                jle     @@exit                  ; выходим, если кол-во элементов <= 1
 
                push    bp
                xor     bp,bp                   ; BP = кол-во рекурсий
                shl     cx,2
                add     cx,dx                   ; CX = адрес последнего элемента
 
                ; Главная процедура быстрой сортировки
                ; DX = адрес первого элемента, CX = адрес последнего элемента, CX > DX, BP = уровень рекурсии
        @@IQSortMain:
                mov     ax,cx
                sub     ax,dx
                shr     ax,2                    ; AX = кол-во элементов минус 1
                cmp     ax,IQSortInsThrs-1
                jb      @@callins               ; если кол-во элементов меньше порогового значения, используем сортировку вставками
 
                mov     si,dx                   ;; I (SI) := L (DX)
        @@repeat1:                              ;; repeat
                mov     di,cx                   ;; J (DI) := R (CX)
                mov     bx,cx
                sub     bx,dx
                shr     bx,1
                and     bx,-4
                add     bx,dx                   ;; P (BX) := (L + R) / 2
                mov     ax,[bx]                 ;; T (AX) := [P]
        @@repeat2 = @@cmpI                      ;; repeat
                ; SI = I, AX = T, DI = J, DX = L, CX = R
                jmp     @@cmpI
        @@addI: add     si,4                    ;; Inc(I)
        @@cmpI: cmp     [si],ax                 ;; while [I] < T
                jl      @@addI                  ; {*** сортировка по возрастанию: jl - знаковое сравнение, jb - беззнаковое; по убыванию: jg - знаковое, ja - беззнаковое}
 
                jmp     @@cmpJ
        @@subJ: sub     di,4                    ;; Dec(J)
        @@cmpJ: cmp     [di],ax                 ;; while [J] > T
                jg      @@subJ                  ; {*** сортировка по возрастанию: jg - знаковое сравнение, ja - беззнаковое; по убыванию: jl - знаковое, jb - беззнаковое}
 
                cmp     si,di
                jnbe    @@noswap                ;; if I <= J then
 
                mov     bx,[si]                 ;;   Swap [I],[J]
                xchg    [di],bx
                mov     [si],bx
                mov     bx,[si+2]
                xchg    [di+2],bx
                mov     [si+2],bx
 
                add     si,4                    ;; Inc(I)
                sub     di,4                    ;; Dec(J)
        @@noswap:
                cmp     si,di
                jna     @@repeat2               ;; until I > J
 
                cmp     dx,di
                jnb     @@norecurs              ;; if L < J then
 
                push    cx
                push    si                      ; сохраняем R и I
                mov     cx,di
                ; DX = L, CX = J
                cmp     bp,(IQSortMaxStk-12)/4  ; 6 слов - это адрес возврата в вызываемую программу + bp + cx + si + адрес возврата из InsSort + bp
                jae     @@callins2              ; если число рекурсий достигло максимума, идём на вызов сортировки вставками: InsSort(L, J)
                inc     bp                      ; иначе увеличиваем глубину рекурсии и идём на рекурсию
                jmp     @@IQSortMain            ;;   IQSort(L, J); вызов делаем через jmp для экономии стека :)
        @@recursret:
                pop     si
                pop     cx                      ; восстанавливаем I и R
        @@norecurs:
                mov     dx,si                   ;; L := I
                cmp     si,cx
                jnae    @@repeat1               ;; until I >= R
        @@finish:
                dec     bp                      ; уменьшаем глубину рекурсии
                jns     @@recursret             ; прыгаем, если это не первый (корневой) уровень рекурсии
                pop     bp
        @@exit: ret
 
        @@callins:
                push    offset @@finish         ; адрес возврата
                jmp     @IQInsSort              ; вместо call + jmp @@finish делаем push + jmp
        @@callins2:
                push    offset @@recursret      ; адрес возврата
                jmp     @IQInsSort              ; вместо call + jmp @@recursret делаем push + jmp
IQSortDE        ENDP
 
;-- InsSortDE: СОРТИРОВКА массива ВСТАВКАМИ ----------------------------------------------------------------------------
; > Входные данные: DS:DX = адрес массива, CX = кол-во элементов массива (знаковое значение)
; > Результат: отсортированный массив (по тому же адресу)
; Элементы массива содержат по 2 значения типа WORD:
;   * первое слово содержит опорное значение (по которому происходит сравнение),
;   * второе слово - связанные с элементом данные (обычно это указатель на данные);
;     при сортировке связанные данные переносятся вместе с опорными значениями
; Процедура изменяет регистры AX, BX, SI, DI, сохраняет CX, DX, BP и сегментные регистры
InsSortDE       PROC
                dec     cx
                jle     @@exit                  ; выходим, если кол-во элементов <= 1
 
                shl     cx,2
                add     cx,dx                   ; CX = адрес последнего элемента
 
                ; Главная процедура сортировки вставками
                ; DX = адрес первого элемента, CX = адрес последнего элемента, CX > DX
IFDEF           ??Version       ; TASM
  @IQInsSort:
ELSE                            ; MASM
  @IQInsSort::
ENDIF
                push    bp
                mov     di,dx                   ; J (DI) := L - адрес первого элемента
        @@next:                                 ;; for J (DI) := L+1 (CX) to R (DX) do
                add     di,4                    ; J++ (DI) - адрес следующего проверяемого элемента (в основном цикле)
                mov     bx,[di]                 ;; T (BP:BX) := [J]
                mov     bp,[di+2]
                mov     si,di                   ; I+1 (SI) = DI - адрес элемента, следующего за сравниваемым (во внутреннем цикле)
        @@loop:                                 ;; repeat
                mov     ax,[si-4]
                cmp     ax,bx                   ;; if [I] > T then
                jle     @@break                 ; прыгаем, если [I] <= T {*** сортировка по возрастанию: jle - знаковое сравнение, jbe - беззнаковое; по убыванию: jge - знаковое, jae - беззнаковое}
 
                mov     [si],ax                 ;;  [I+1] := [I] else Break
                mov     ax,[si-4+2]
                mov     [si+2],ax
 
                sub     si,4                    ;; Dec(I)
                cmp     si,dx
                jnbe    @@loop                  ;; until I < L (I+1 <= L)
        @@break:
                mov     [si],bx                 ;; [I+1] := T
                mov     [si+2],bp
 
                cmp     di,cx
                jnae    @@next                  ; следующий элемент массива ;; end for
 
                pop     bp
        @@exit: ret
InsSortDE       ENDP


Вернуться к обсуждению:
Программа для сортировки любого массива
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2017, 13:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Переделать код для сортировки массива на код для сортировки двумерной матрицы
возникла проблема, не могу переделать код для сортировки массива на код для сортировки двумерной...

Не работает программа сортировки массива
Помогите найти ошибку program pas1; var i, j, n, k, t: integer; ax: array of integer; c:...

Программа сортировки массива методом пузырька
Здравствуйте! Пожалуйста, помогите написать программу! Вот задание: Создать на C++ Builder...

Нужна программа для ввода текста в окно любого чата
Доброго времени суток, хотел бы сделать программму для вывода текста в чат и отправки. Не судите...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.