Автор Rufusnone задал вопрос в разделе Другие языки и технологии
Сортировка вставками и сортировка слиянием! и получил лучший ответ
Ответ от Николай Веселуха[гуру]
// сортировка вставками
#include <iostream>
using namespace std;
void insertion_sort(int *, const size_t);
void show_vector(int *, const size_t);
int main() {
int vector[] = { 9,5,3,1,6,7,4,8,2 };
size_t size = sizeof(vector) / sizeof(int);
locale::global(locale(""));
cout << " Исходный массив: ";
show_vector(vector, size);
insertion_sort(vector, size);
cout << " Отсортированный массив: ";
show_vector(vector, size);
cin.get(); cin.get();
return 0;
}
void insertion_sort(int * _vector, const size_t _size) {
int temp;
rsize_t m;
for (rsize_t n = 1; n < _size; n++) {
temp = _vector[n];
m = n - 1;
while (m >= 0 && _vector[m] > temp) {
_vector[m + 1] = _vector[m];
--m;
}
_vector[m + 1] = temp;
}
}
void show_vector(int * _vector, const size_t _size) {
for (rsize_t n = 0; n < _size; n++) cout << _vector[n] << ' ';
cout << endl;
}
// сортировка слиянием
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void merge_sort(int *, size_t, size_t);
void merge(int *, size_t, size_t, size_t);
void test_array(int *, size_t);
int main() {
int a[] = { 2, 7, 8, 3, 9, 4, 5, 1, 6 };
size_t size = sizeof(a) / sizeof(int);
test_array(a, size);
merge_sort(a, 0, size - 1);
test_array(a, size);
_getch();
return 0;
}
void test_array(int * _array, size_t _size){
size_t n;
for (n = 0; n < _size; n++) printf("%3i", _array[n]);
printf("
");
}
void merge_sort(int * _array, size_t _left, size_t _rigth) {
size_t middle;
if (_left < _rigth) {
middle = (_left + _rigth) / 2;
merge_sort(_array, _left, middle);
merge_sort(_array, middle + 1, _rigth);
merge(_array, _left, middle, _rigth);
}
}
void merge(int * _array, size_t _left, size_t _middle, size_t _rigth) {
size_t pos_1 = _left, pos_2 = _middle + 1, pos_3 = 0, size = _rigth - _left + 1;
int * temp = (int *)calloc(size, sizeof(int));
if (temp) {
while (pos_1 <= _middle && pos_2 <= _rigth)
if (_array[pos_1] < _array[pos_2]) temp[pos_3++] = _array[pos_1++];
else temp[pos_3++] = _array[pos_2++];
while (pos_2 <= _rigth) temp[pos_3++] = _array[pos_2++];
while (pos_1 <= _middle) temp[pos_3++] = _array[pos_1++];
for (pos_3 = 0; pos_3 < size; pos_3++) _array[_left + pos_3] = temp[pos_3];
free(temp);
} else exit(EXIT_FAILURE);
}
А уж со временем и подсчётом сам...
Источник: http://otvet.mail.ru/answer/439873033
Николай Веселуха
Высший разум
(188205)
У меня Visual C++ 2010 и слияние написано на Си, а вставки на С++
Не могу сказать почему такое неадекватное поведение.