change mergesort

This commit is contained in:
Kaehvaman 2024-11-30 19:10:18 +04:00
parent f3a7a7be10
commit dc58ebe57f
7 changed files with 104 additions and 72 deletions

View File

@ -1,5 +1,14 @@
#define _CRT_SECURE_NO_WARNINGS
#include "SortStringArray.h" #include "SortStringArray.h"
// Ñëîâà, çàãðóæåííûå èç ôàéëà
char words[MAX_WORDS][MAX_LEN_WORD];
// Êîëè÷åñòâî ñëîâ â ìàññèâå
int n = 0;
// Ìàññèâ äëÿ ñîðòèðîâêè
char a[MAX_WORDS][MAX_LEN_WORD];
int LoadWords(char* filename) { int LoadWords(char* filename) {
// îòêðûòü ôàéë // îòêðûòü ôàéë
FILE* fin = fopen(filename, "r"); FILE* fin = fopen(filename, "r");
@ -38,7 +47,6 @@ void CopyWordsToA() {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
strcpy(a[i], words[i]); strcpy(a[i], words[i]);
} }
} }
int ArraysAreEqual() { int ArraysAreEqual() {
@ -74,7 +82,7 @@ void swapWords(char a[], char b[]) {
char tmp[MAX_LEN_WORD]; char tmp[MAX_LEN_WORD];
strcpy(tmp, a); strcpy(tmp, a);
strcpy(a, b); strcpy(a, b);
strcpy(a, tmp); strcpy(b, tmp);
} }
int isSortedStringArray(char a[MAX_WORDS][MAX_LEN_WORD]) { int isSortedStringArray(char a[MAX_WORDS][MAX_LEN_WORD]) {
@ -162,70 +170,81 @@ void InsertionSortStrings() {
} }
} }
/** // Merges two subarrays of arr[].
* Сортирует массив, используя рекурсивную сортировку слиянием // First subarray is arr[l..m]
* up - указатель на массив, который нужно сортировать // Second subarray is arr[m+1..r]
* down - указатель на массив с, как минимум, таким же размером как у 'up', используется как буфер void merge(char arr[MAX_WORDS][MAX_LEN_WORD], int l, int m, int r)
* left - левая граница массива, передайте 0, чтобы сортировать массив с начала {
* right - правая граница массива, передайте длину массива - 1, чтобы сортировать массив до последнего элемента int i, j, k;
* возвращает: указатель на отсортированный массив. Из-за особенностей работы данной реализации int n1 = m - l + 1;
* отсортированная версия массива может оказаться либо в 'up', либо в 'down' int n2 = r - m;
**/
char* MergeSortStrings(char* up, char* down, unsigned int left, unsigned int right) {
if (left == right) // Create temp arrays
{ char L[MAX_WORDS][MAX_LEN_WORD], R[MAX_WORDS][MAX_LEN_WORD];
strcpy(down[left], up[left]);
return down; // Copy data to temp arrays L[] and R[]
for (i = 0; i < n1; i++) {
strcpy(L[i], arr[l + i]);
}
for (j = 0; j < n2; j++) {
strcpy(R[i], arr[m + 1 + j]);
} }
unsigned int middle = left + (right - left) / 2; // Merge the temp arrays back into arr[l..r
i = 0;
// разделяй и сортируй j = 0;
char* l_buff = MergeSortStrings(up, down, left, middle); k = l;
char* r_buff = MergeSortStrings(up, down, middle + 1, right); while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
// слияние двух отсортированных половин strcpy(arr[k], L[i]);
char* target = (l_buff == up) ? down : up; i++;
unsigned int l_cur = left, r_cur = middle + 1;
for (unsigned int i = left; i <= right; i++)
{
if (l_cur <= middle && r_cur <= right)
{
if (strcmp(l_buff[l_cur], r_buff[r_cur]) < 0)
{
strcpy(target[i], l_buff[l_cur]);
l_cur++;
}
else
{
strcpy(target[i], r_buff[r_cur]);
r_cur++;
}
} }
else if (l_cur <= middle) else {
{ strcpy(arr[k], R[j]);
strcpy(target[i], l_buff[l_cur]); j++;
l_cur++;
}
else
{
strcpy(target[i], r_buff[r_cur]);
r_cur++;
} }
k++;
}
// Copy the remaining elements of L[],
// if there are any
while (i < n1) {
strcpy(arr[k], L[i]);
i++;
k++;
}
// Copy the remaining elements of R[],
// if there are any
while (j < n2) {
strcpy(arr[k], R[j]);
j++;
k++;
} }
return target;
} }
void ShellSort(char* array, int size) { // l is for left index and r is right index of the
for (int s = size / 2; s > 0; s /= 2) { // sub-array of arr to be sorted
for (int i = s; i < size; ++i) { void MergeSortStrings(char arr[MAX_WORDS][MAX_LEN_WORD], int l, int r){
for (int j = i - s; j >= 0 && strcmp(array[j], array[j + s]) > 0; j -= s) { if (l < r) {
int m = l + (r - l) / 2;
// Sort first and second halves
MergeSortStrings(arr, l, m);
MergeSortStrings(arr, m + 1, r);
merge(arr, l, m, r);
}
}
void ShellSort() {
for (int s = MAX_WORDS / 2; s > 0; s /= 2) {
for (int i = s; i < MAX_WORDS; ++i) {
for (int j = i - s; j >= 0 && strcmp(a[j], a[j + s]) > 0; j -= s) {
char tmp[MAX_LEN_WORD]; char tmp[MAX_LEN_WORD];
strcpy(tmp, array[j]); strcpy(tmp, a[j]);
strcpy(array[j], array[j + s]); strcpy(a[j], a[j + s]);
strcpy(array[j + s], tmp); strcpy(a[j + s], tmp);
} }
} }
} }

View File

@ -9,13 +9,14 @@
// Ìàêñèìàëüíîå êîëè÷åñòâî ñëîâ // Ìàêñèìàëüíîå êîëè÷åñòâî ñëîâ
#define MAX_WORDS 20000 #define MAX_WORDS 20000
extern int n;
// Ñëîâà, çàãðóæåííûå èç ôàéëà // Ñëîâà, çàãðóæåííûå èç ôàéëà
extern char words[MAX_WORDS][MAX_LEN_WORD]; extern char words[MAX_WORDS][MAX_LEN_WORD];
// Êîëè÷åñòâî ñëîâ â ìàññèâå
extern int n = 0;
// Ìàññèâ äëÿ ñîðòèðîâêè // Ìàññèâ äëÿ ñîðòèðîâêè
extern char a[MAX_WORDS][MAX_LEN_WORD]; extern char a[MAX_WORDS][MAX_LEN_WORD];
int LoadWords(char* filename); int LoadWords(char* filename);
void CopyWordsToA(); void CopyWordsToA();
int ArraysAreEqual(); int ArraysAreEqual();
@ -26,8 +27,8 @@ void SelectionSortStrings();
void QuickSortStrings(); void QuickSortStrings();
void BubbleSortStrings(); void BubbleSortStrings();
void InsertionSortStrings(); void InsertionSortStrings();
char* MergeSortStrings(char* up, char* down, unsigned int left, unsigned int right); void MergeSortStrings(char arr[MAX_WORDS][MAX_LEN_WORD], int l, int r);
void ShellSort(char* array, int size); void ShellSort();
int LinearSearchStrings(char target[], char source[MAX_WORDS][MAX_LEN_WORD]); int LinearSearchStrings(char target[], char source[MAX_WORDS][MAX_LEN_WORD]);
int BinarySearchStrings(char target[], char source[MAX_WORDS][MAX_LEN_WORD]); int BinarySearchStrings(char target[], char source[MAX_WORDS][MAX_LEN_WORD]);

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

13
lab25/lab25/dict0.txt Normal file
View File

@ -0,0 +1,13 @@
Alice
to
of
by
on
the
and
or
into
but
it
no

View File

@ -5,20 +5,17 @@
#include "SortStringArray.h" #include "SortStringArray.h"
int main() { int main() {
LoadWords("/TextMarkup/dict0.txt"); LoadWords("TextMarkup/dict4.txt");
int iter = 3;
clock_t start = clock();
for (int i = 0; i < 1; i++) { for (int i = 0; i < iter; i++) {
CopyWordsToA(); CopyWordsToA();
//memcpy(a, words, sizeof(words));
clock_t start = clock(); //SelectionSortStrings();
SelectionSortStrings();
//QuickSortStrings(); //QuickSortStrings();
MergeSortStrings(a, 0, MAX_WORDS-1);
printf_s("time = %.3lf seconds", (double)(clock() - start) / (double)CLOCKS_PER_SEC);
if (!ArraysAreEqual()) { if (!ArraysAreEqual()) {
printf("Arrays are not equal!!!\n"); printf("Arrays are not equal!!!\n");
@ -27,7 +24,9 @@ int main() {
printf("Array is not sorted!!!\n"); printf("Array is not sorted!!!\n");
} }
} }
double runtime = (double)(clock() - start) / (double)CLOCKS_PER_SEC;
printf_s("full time = %.3lf seconds\n", runtime);
printf_s("single sort time = %.3lf seconds\n", runtime / iter);
return 0; return 0;
} }

BIN
lab25/lab25/sort test.xlsx Normal file

Binary file not shown.