Целью лабораторной работы является изучение и практическая реализация наиболее популярных методов сортировки
В задание на выполнение входит самостоятельное построение демонстрационного приложения для моделирования работы методов сортировки в IDE C++Builder 6.0.
Файл точки входа Sort.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USEFORM("USort.cpp", MainForm);
USEFORM("UAbout.cpp", AboutBox);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), amp;MainForm);
Application->CreateForm(__classid(TAboutBox), amp;AboutBox);
Application->Run();
}
catch (Exception amp;exception)
{
Application->ShowException(amp;exception);
}
return 0;
}
//---------------------------------------------------------------------------
Файл объявления главной формы USort.h
//---------------------------------------------------------------------------
#ifndef USortH
#define USortH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
const MAX_COUNT = 10;
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *SortBtn;
TRadioGroup *RadioGroup;
TMemo *Memo2;
TButton *CleanLeftBtn;
TButton *CleanRightBtn;
TLabel *TitleNonSortLbl;
TLabel *TitleSortLbl;
TButton *ExitBtn;
TPopupMenu *PopupMenu;
TMenuItem *About;
void __fastcall Memo1KeyPress(TObject *Sender, char amp;Key);
void __fastcall Memo1Change(TObject *Sender);
void __fastcall ExitBtnClick(TObject *Sender);
void __fastcall CleanLeftBtnClick(TObject *Sender);
void __fastcall CleanRightBtnClick(TObject *Sender);
void __fastcall SortBtnClick(TObject *Sender);
void __fastcall AboutClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
Файл реализации интерфейса пользователя USort.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "USort.h"
#include "Metods.h"
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
for(int i=MAX_COUNT; i>=0; i--){
AnsiString symbol = IntToStr(i);
Memo1->Lines->Add("");
Memo1->Lines->Strings[MAX_COUNT-i] = symbol;
// Memo->Lines->Insert(i, symbol);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Memo1KeyPress(TObject *Sender, char amp;Key)
{
Set<char, '0', '9'> Digit;// Фильтр для цифр
Digit << '0' << '1' << '2' << '3' << '4'
<< '5' << '6' << '7' << '8' << '9';
if( !Digit.Contains( Key )
amp;amp; Key != VK_BACK
amp;amp; Key != VK_RETURN ) {
Key = 0;
Beep();
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Memo1Change(TObject *Sender)
{
if(Memo1->Lines->Strings[Memo1->Lines->Count-1].IsEmpty())
Memo1->Lines->Delete(Memo1->Lines->Count-1);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ExitBtnClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CleanLeftBtnClick(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CleanRightBtnClick(TObject *Sender)
{
Memo2->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SortBtnClick(TObject *Sender)
{
enum{SIMPLE, BIN, SHELL, SELECT,
BUBBLE, MEMORY, SHAKER, QUICK};
const n = Memo1->Lines->Count;
if(n < 2){
ShowMessage("Нечего сортировать");
return;
}
int *a = new int[n];
for(int i = 0; i<n; i++)
a[i] = StrToInt(Memo1->Lines->Strings[i]);
int choice = RadioGroup->ItemIndex;
switch(choice){
case SIMPLE: simplySort(n, a); break;
case BIN: binSort(n, a); break;
case SHELL: shellSort(n, a); break;
case SELECT: selectSort(n, a); break;
case BUBBLE: bubbleSort(n, a); break;
case MEMORY: memorySort(n, a); break;
case SHAKER: shakerSort(n, a); break;
case QUICK: quickSort(n, a); break;
default: ShowMessage("Неизвестный метод сортировки");
return;
}
Memo2->Clear();
for(int i = 0; i<n; i++)
Memo2->Lines->Insert(i, IntToStr(a[i]));
delete [] a;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AboutClick(TObject *Sender)
{
AboutBox->ShowModal();
}
//---------------------------------------------------------------------------
Файл объявления методов сортировки Metods.h //--------------------------------------------------------------------------- #ifndef MetodsH #define MetodsH //--------------------------------------------------------------------------- void simplySort(int, int []); void binSort(int m, int b[]); void shellSort(int n, int a[]); void selectSort(int, int *); void bubbleSort(int n, int a[]); void memorySort(int n, int a[]); void shakerSort(int n, int a[]); void quickSort(int n, int a[]); #endif
Файл реализации методов сортировки Metods.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Metods.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Сортировка простыми включениями
void simplySort(int n, int a[])
{
int i, j, x;
for(i=1; i<n; i++){
x = a[i]; j = i-1;
while(x<a[j] amp;amp; j>=0){
a[j+1] = a[j];
j--;
}
a[j+1] = x;
}
}
//---------------------------------------------------------------------------
// Сортровка бинарными включениями
void binSort(int n, int *a)
{
int i, j, left, right, m; // индексы элементов
int x; // опорный элемент
for(i = 1; i < n; i++){
x = a[i];
left = 0;
right = i - 1;
while(left <= right){
m = (left + right) / 2;
if(x < a[m])
right = m - 1;
else
left = m + 1;
} // конец while(left <= right)
for(j = i - 1; j >= left; j--)
a[j + 1] = a[j];
a[left] = x;
} // конец for(i = 1; i < n; i++)
}
//---------------------------------------------------------------------------
// Сортировка Шелла
void shellSort(int n, int a[])
{
int i, j, k, m, t;
int x;
static int h[4] = {15, 7, 3, 1};
t = 4;
for(m = 0; m < t; m++){
if(h[m] >= n) continue;
k = h[m];
for(i = k; i < n; i++){
x = a[i];
j = i - k;
while(x < a[j] amp;amp; j >= 0){
a[j + k] = a[j];
j -= k;
}
a[j + k] = x;
}
}
}
//---------------------------------------------------------------------------
// Сортировка простым выбором
void selectSort(int n, int a[])
{
int i, j, k;
int x; // опорный элемент
for(i = 0; i < n - 1; i++){
k = i;
x = a[i];
for(j = i + 1; j < n; j++)
if(a[j] < x){
k = j;
x = a[j];
}
a[k] = a[i];
a[i] = x;
} // End of for i
}
//---------------------------------------------------------------------------
// Сортировка методом пузырька
void bubbleSort(int n, int a[])
{
int i, j;
int x;
for(i = 1; i < n; i++){
for(j = n - 1; j >= i; j--){
if(a[j-1] > a[j]){
x = a[j-1];
a[j-1] = a[j];
a[j] = x;
}
}
}
}
//---------------------------------------------------------------------------
// Сортировка с памятью обмена
void memorySort(int n, int a[])
{
int i, j, k, m;
int x;
k = 0;
for(i=1; i<n; i++){
m=k;
for(j=n-1; j>m; j--)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
if(m==k)
break;
}
}
//---------------------------------------------------------------------------
// Шейкер-сортировка (двухпроходная сортировка)
void shakerSort(int n, int a[])
{
int j, k, left, right;
int x;
left=0;
right=n-1;
k=n-1;
while(left<right){
for(j=right; j>left; j--)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
left=k;
for(j=left; j<=right; j++)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
right=k-1;
}
}
//---------------------------------------------------------------------------
// Сортировка Хоора (сортировка с разделением;
// "быстрая" сортировка
void quickSort(int n, int a[])
{
void sort(int leftIndex, int rightIndex, int sortArray[]);
sort(0, n-1, a);
}
// Рекурсивная подпрограмма быстрой сортировки
void sort(int left, int right, int a[])
{
register i, j, x;
int w;
i=left; j=right; x=a[(left+right)/2];
while(i<=j){
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i<=j){
w=a[i]; a[i]=a[j]; a[j]=w;
i++; j--;
}
}
if(left<j) sort(left, j, a);
if(i<right) sort(i, right, a);
}
//---------------------------------------------------------------------------
Заголовочный файл UAbout.h
//---------------------------------------------------------------------------
#ifndef UAboutH
#define UAboutH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TAboutBox : public TForm
{
__published: // IDE-managed Components
TImage *Image;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
private: // User declarations
public: // User declarations
__fastcall TAboutBox(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TAboutBox *AboutBox;
//---------------------------------------------------------------------------
#endif
Файл реализации UAbout.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Целью лабораторной работы является изучение и практическая реализация наиболее популярных методов сортировки
В задание на выполнение входит самостоятельное построение демонстрационного приложения для моделирования работы методов сортировки в IDE C++Builder 6.0.
Файл точки входа Sort.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USEFORM("USort.cpp", MainForm);
USEFORM("UAbout.cpp", AboutBox);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), amp;MainForm);
Application->CreateForm(__classid(TAboutBox), amp;AboutBox);
Application->Run();
}
catch (Exception amp;exception)
{
Application->ShowException(amp;exception);
}
return 0;
}
//---------------------------------------------------------------------------
Файл объявления главной формы USort.h
//---------------------------------------------------------------------------
#ifndef USortH
#define USortH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
const MAX_COUNT = 10;
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *SortBtn;
TRadioGroup *RadioGroup;
TMemo *Memo2;
TButton *CleanLeftBtn;
TButton *CleanRightBtn;
TLabel *TitleNonSortLbl;
TLabel *TitleSortLbl;
TButton *ExitBtn;
TPopupMenu *PopupMenu;
TMenuItem *About;
void __fastcall Memo1KeyPress(TObject *Sender, char amp;Key);
void __fastcall Memo1Change(TObject *Sender);
void __fastcall ExitBtnClick(TObject *Sender);
void __fastcall CleanLeftBtnClick(TObject *Sender);
void __fastcall CleanRightBtnClick(TObject *Sender);
void __fastcall SortBtnClick(TObject *Sender);
void __fastcall AboutClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
Файл реализации интерфейса пользователя USort.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "USort.h"
#include "Metods.h"
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
for(int i=MAX_COUNT; i>=0; i--){
AnsiString symbol = IntToStr(i);
Memo1->Lines->Add("");
Memo1->Lines->Strings[MAX_COUNT-i] = symbol;
// Memo->Lines->Insert(i, symbol);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Memo1KeyPress(TObject *Sender, char amp;Key)
{
Set<char, '0', '9'> Digit;// Фильтр для цифр
Digit << '0' << '1' << '2' << '3' << '4'
<< '5' << '6' << '7' << '8' << '9';
if( !Digit.Contains( Key )
amp;amp; Key != VK_BACK
amp;amp; Key != VK_RETURN ) {
Key = 0;
Beep();
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Memo1Change(TObject *Sender)
{
if(Memo1->Lines->Strings[Memo1->Lines->Count-1].IsEmpty())
Memo1->Lines->Delete(Memo1->Lines->Count-1);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ExitBtnClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CleanLeftBtnClick(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CleanRightBtnClick(TObject *Sender)
{
Memo2->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SortBtnClick(TObject *Sender)
{
enum{SIMPLE, BIN, SHELL, SELECT,
BUBBLE, MEMORY, SHAKER, QUICK};
const n = Memo1->Lines->Count;
if(n < 2){
ShowMessage("Нечего сортировать");
return;
}
int *a = new int[n];
for(int i = 0; i<n; i++)
a[i] = StrToInt(Memo1->Lines->Strings[i]);
int choice = RadioGroup->ItemIndex;
switch(choice){
case SIMPLE: simplySort(n, a); break;
case BIN: binSort(n, a); break;
case SHELL: shellSort(n, a); break;
case SELECT: selectSort(n, a); break;
case BUBBLE: bubbleSort(n, a); break;
case MEMORY: memorySort(n, a); break;
case SHAKER: shakerSort(n, a); break;
case QUICK: quickSort(n, a); break;
default: ShowMessage("Неизвестный метод сортировки");
return;
}
Memo2->Clear();
for(int i = 0; i<n; i++)
Memo2->Lines->Insert(i, IntToStr(a[i]));
delete [] a;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AboutClick(TObject *Sender)
{
AboutBox->ShowModal();
}
//---------------------------------------------------------------------------
Файл объявления методов сортировки Metods.h //--------------------------------------------------------------------------- #ifndef MetodsH #define MetodsH //--------------------------------------------------------------------------- void simplySort(int, int []); void binSort(int m, int b[]); void shellSort(int n, int a[]); void selectSort(int, int *); void bubbleSort(int n, int a[]); void memorySort(int n, int a[]); void shakerSort(int n, int a[]); void quickSort(int n, int a[]); #endif
Файл реализации методов сортировки Metods.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Metods.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Сортировка простыми включениями
void simplySort(int n, int a[])
{
int i, j, x;
for(i=1; i<n; i++){
x = a[i]; j = i-1;
while(x<a[j] amp;amp; j>=0){
a[j+1] = a[j];
j--;
}
a[j+1] = x;
}
}
//---------------------------------------------------------------------------
// Сортровка бинарными включениями
void binSort(int n, int *a)
{
int i, j, left, right, m; // индексы элементов
int x; // опорный элемент
for(i = 1; i < n; i++){
x = a[i];
left = 0;
right = i - 1;
while(left <= right){
m = (left + right) / 2;
if(x < a[m])
right = m - 1;
else
left = m + 1;
} // конец while(left <= right)
for(j = i - 1; j >= left; j--)
a[j + 1] = a[j];
a[left] = x;
} // конец for(i = 1; i < n; i++)
}
//---------------------------------------------------------------------------
// Сортировка Шелла
void shellSort(int n, int a[])
{
int i, j, k, m, t;
int x;
static int h[4] = {15, 7, 3, 1};
t = 4;
for(m = 0; m < t; m++){
if(h[m] >= n) continue;
k = h[m];
for(i = k; i < n; i++){
x = a[i];
j = i - k;
while(x < a[j] amp;amp; j >= 0){
a[j + k] = a[j];
j -= k;
}
a[j + k] = x;
}
}
}
//---------------------------------------------------------------------------
// Сортировка простым выбором
void selectSort(int n, int a[])
{
int i, j, k;
int x; // опорный элемент
for(i = 0; i < n - 1; i++){
k = i;
x = a[i];
for(j = i + 1; j < n; j++)
if(a[j] < x){
k = j;
x = a[j];
}
a[k] = a[i];
a[i] = x;
} // End of for i
}
//---------------------------------------------------------------------------
// Сортировка методом пузырька
void bubbleSort(int n, int a[])
{
int i, j;
int x;
for(i = 1; i < n; i++){
for(j = n - 1; j >= i; j--){
if(a[j-1] > a[j]){
x = a[j-1];
a[j-1] = a[j];
a[j] = x;
}
}
}
}
//---------------------------------------------------------------------------
// Сортировка с памятью обмена
void memorySort(int n, int a[])
{
int i, j, k, m;
int x;
k = 0;
for(i=1; i<n; i++){
m=k;
for(j=n-1; j>m; j--)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
if(m==k)
break;
}
}
//---------------------------------------------------------------------------
// Шейкер-сортировка (двухпроходная сортировка)
void shakerSort(int n, int a[])
{
int j, k, left, right;
int x;
left=0;
right=n-1;
k=n-1;
while(left<right){
for(j=right; j>left; j--)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
left=k;
for(j=left; j<=right; j++)
if(a[j-1]>a[j]){
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
k=j;
}
right=k-1;
}
}
//---------------------------------------------------------------------------
// Сортировка Хоора (сортировка с разделением;
// "быстрая" сортировка
void quickSort(int n, int a[])
{
void sort(int leftIndex, int rightIndex, int sortArray[]);
sort(0, n-1, a);
}
// Рекурсивная подпрограмма быстрой сортировки
void sort(int left, int right, int a[])
{
register i, j, x;
int w;
i=left; j=right; x=a[(left+right)/2];
while(i<=j){
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i<=j){
w=a[i]; a[i]=a[j]; a[j]=w;
i++; j--;
}
}
if(left<j) sort(left, j, a);
if(i<right) sort(i, right, a);
}
//---------------------------------------------------------------------------
Заголовочный файл UAbout.h
//---------------------------------------------------------------------------
#ifndef UAboutH
#define UAboutH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TAboutBox : public TForm
{
__published: // IDE-managed Components
TImage *Image;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
private: // User declarations
public: // User declarations
__fastcall TAboutBox(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TAboutBox *AboutBox;
//---------------------------------------------------------------------------
#endif
Файл реализации UAbout.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.