Сортировка массива методом прямого включения

Автор: Пользователь скрыл имя, 22 Февраля 2012 в 13:13, курсовая работа

Описание работы

Целью курсового проекта является рассмотрение различных алгоритмов сортировки массива. В качестве практической проблемы, требующей решения, рассматривается известная задача сортировки (упорядочивания) массива в порядке возрастания (убывания) его элементов. При решении этой задачи требуется исходный массив, содержащий произвольные целые числа, преобразовать к виду, когда каждый элемент массива находится перед другим элементом этого массива, если его значение меньше (больше), чем значение сравниваемого элемента.

Содержание

ВВЕДЕНИЕ…………...........................................................................................4
1. Исследовательский раздел
1.1. Массивы………………………………………………………………..5
1.2. Описание методов сотрировки массивов и их алгоритмы….......5
2. Технологический раздел
2.1. Постановка задачи и предлагаемый алгоритм решения……….12
2.2. Описание команд языка программирования Ассемблер...……..13
2.3. Описание команд языка программирования С++……………….13
2.4 Коментированный ход решения в С++…………………………....15
2.5 Коментированный ход решения в Ассемблере…………………..18
Заключение………………………………………………………………...22СПИСОК ЛИТЕРАТУРЫ…………………………………………………….23

Работа содержит 1 файл

Курсовой проект на тему Сортировка массива методом прямого включения.doc

— 573.00 Кб (Скачать)

        сдвиг элементов массива от i-го до j-1-го вправо, чтобы освободить найденную позицию вставки;

        вставка взятого элемента в найденную i-ю позицию.

 

 

 


2.2 Описание команд языка программирования Ассемблер

 

Команда

Описание

Equ

Определение константы

Mov

Копирование значения

Xor

Логическая операция «исключающее ИЛИ»

Lea

Сохранение адреса второго операнда, в первый

Int

Вызов прерывания

Add

Сложение операндов

Jmp

Безусловный переход

Shl

Умножение на степень двойки

Cmp

Сравнение операндов

Jle

Условный переход, если первый операнд =< второго операнда

Jg

Условный переход, если первый операнд > второго операнда

Inc

Инкремент, увеличение значения на единицу

Jl

Условный переход, если первый операнд < второго операнда

Loop 

Организация цикла

End

Конец программы

 

2.3 Описание команд языка программирования С++

 

Команда

Описание

Include

Подключение библиотек

Int

Указание целочисленного типа данных

char

Указание символьного типа данных

For

Цикл со счетчиком

Return

Возвращение чего-либо

printf

Вывод информации на экран

scanf

Ввод информации с клавиатуры

If

Условие

Getch

Ожидание нажатия кнопки на клавиатуре

Endl

Конец строки


3.2.1.Комментированный исходный код решения в С++

 

    #include <stdio.h>  //заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода.   

    #include <conio.h> //консольный ввод-вывод

    int vibor (int in[], int n); //

    

    void main ()

    {

    int m=0; //объявление целочисленной переменной m значения 0

    int s; // объявление целочисленной переменной s

    int vvh [100]; //объявление количества целочисленных переменных

                                                                                   

    //Ввод массива

 

    char f [80];  //объявление количества символьных переменных

    printf("\n vvedite chislo elementov v massive: ", f);

    scanf ("%d", &m);                                                        //Узнаем размер массива

    printf("\n vvedite cherez probel celie chisla: ", f);

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

    scanf ("%d", &vvh[j]);                                          //Заполнение массива

    

                            printf ("\n");

                            s = vibor (vvh, m); //Сортировка методом включения

                                

                            getch();  //экран не закрывается пока не нажата любая клавиша

    }

    

    int vibor (int in[], int n)

    {

                            int sravnen=0; //Характеристика трудоемкости (число стравнений)

                                          //Вывод сообщений

                            char f [80];

                            printf("\n sortirovka metodom priamogo vklucheniya: \n", f);

                                          //Начало сортировки

                            int i;

                            for (i=0; i<n-1; i++)              //n-1 раз ищем наименьший элемент

                            {

int imin=i;              //принимаем за наименьший первый из                 рассматриваемых элементов

                                                                                    //Поиск минимального элемента

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

                                          {

                                                        if (in[j]<in[imin]) imin = j;

                                                        sravnen++;

                                          }

                                          int a = in[i]; in[i]=in[imin]; in[imin]=a; //Обмен элементов

                            }

    

                                                        //Вывод результатов работы программы

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

    printf ("%d ", in[i]);

    printf ("\n");

    

    return sravnen;                                          //Возвращаем число сравнений

    }

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 


2.2.1 Комментированный исходный код решения в Ассемблере

 

assume CS: code, DS: data 

 

data segment ;сегмент данных

 

mas dw 9 ,2 ,4 ,0 ,1 ,9 ,3 ,6 ,5 ,8 ;заданные числа массива

mes1 db 'Исходный массив: $',10,13,             

mes2 db 10,13,'Отсортированный массив: $'

n equ 9

i dw 0

j dw 0

temp dw 0

pkey db 10,13,'Нажмите "ОК" в окне... $'

 

stk segment stack

dw 128 dup (0) ;резервируется  память объемом 128 слов

stk ends

code segment

 

begin: ;начало программы

mov AX, data  ;заносится значение переменной data в ;AX

    mov DS, AX              ;заносится значение переменной AX в

              ;DS

    mov AH, 09h              ;заносится значение 09h в переменную

              ;AH

    mov DX, offset mes1 ;заполнение исходного массива

    int 21h

 

    mov cx,10 ;заносится значение 10 в переменную СХ

    mov si,0 ;заносится значение 0 в переменную SI

show_primary: ;цикл заполнения исходного массива

    mov dx,mas[si];заносится значение переменной ;mas[si] в переменную

    add dl,30h

    mov ah,02h ;

    int 21h   ;вывод значения на экран

    add si,2

loop show_primary ;цикл будет повторяться до тех пор   пока не заполниться массив

 

internal: ;внутренний цикл

    mov j,9

    jmp cycl_j ;переход к cycl_j

   

exchange: цикл обмена

        mov bx,i ;поместить в bx значение i

        shl bx,1 ;сдвиг значения bx на 1 влево

        mov ax,mas[bx] ;поместить в ax

  ;значение;mas[bx]

        mov bx,j ;поместить j в bx

        shl bx,1 ;сдвиг значения bx на 1 влево

        cmp ax,mas[bx] ;сравнение элемента mas[bx] с ax

        jle lesser ;переход  к lesser

       

        mov bx,i ;поместить i в bx

        shl bx,1 ;умножение bx на 2

        mov temp,ax ;поместить ax в temp

       

        mov bx,j ;поместить j в bx

        shl bx,1

        mov ax,mas[bx]

        mov bx,i

        shl bx,1

        mov mas[bx],ax

       

        mov bx,j

        shl bx,1

        mov ax,temp

        mov mas[bx],ax

        lesser:

            dec j ;уменьшить j на 1

            cycl_j:

            mov ax,j

            cmp ax,i

    jg exchange

 

    inc i ;

    cmp i,n ;

jl internal

 

mov AH, 09h ;

mov DX, offset mes2 ;

int 21h ;

 

mov cx,10 ;

mov si,0 ;

 

show:

    mov dx,mas[si] ;

    add dl,30h ;

    mov ah,02h ;

    int 21h ;

    add si,2 ;

loop show ;

 

mov AH, 08h ;

       

lea dx, pkey ;

mov ah, 9 ;

int 21h        ; output string at ds:dx

   

; ожидание нажатия клавиши....   

mov ah, 1       

       

mov AH, 4Ch

mov AL, 00h

int 21h

  

mov ax, 4c00h ;выход в операционную систему

int 21h ;

 

code ends ;

 

 

 

 


Заключение

В процессе выполнения курсового проекта были изучены алгоритмы сортировки массивов. Была составлена программа на языках программирования С++ и Ассемблер, реализующая сортировку массива методом прямого включения.

Из данного курсового проекта можно сделать вывод, что языки программирования Ассемблер и С++ до сих пор востребованы и неотъемлемо связаны с компьютером. И поэтому самой быстрой программой на данном оборудовании всегда будет программа, написанная на ассемблере. Данная программа позволяет переводить текст с языка, понятного человеку, в язык, понятный процессору.

Рис. 5 Пример работы программы

Рис. 6 Результаты выполения программы

СПИСОК ЛИТЕРАТУРЫ

1. Р. Марек - Ассемблер на примерах. Базовый курс. НиТ, 2005. – 233 с

2. Архангельский А.Я. Программирование в C++ Builder 6. БИНОМ, 2003. – 1152 с.

3. Р.Лафоре - Объектно-ориентированное программирование в С++. Питер,  2004. – 922 с

4. Пирогов В.Ю. ASSEMBLER Учебный курс. Нолидж, 2001. - 846 с

5. Дональд Э. К. Искусство программирования, том 3 Сортировка. Вильямс, 2007. – 824 с

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



Информация о работе Сортировка массива методом прямого включения