Я реализовал четыре сортировки, вывел их результат в виде таблицы, в двух из них все равно получаю неверный результат. Сортирую четыре массива заполненных по возрастанию/убыванию/случайными числами.
Хочу узнать ваше мнения, правильно ли я сортирую и запоминаю кол-во перестановок (сравнений) .
Обе сортировки скину и сюда http://pastebin.com/x5B2RYtG
Пузырьковая сортировка с ограниченным числом проходов
int BubbleSort (int *a, int n)
{
int i, j, x, flag=1, col3=0;
for (i=1; flag; i++)
{
flag = 0;//признак упорядоченной последовательности
for (j=n-1; j>=i; j--)
if (a[j]>a[j-1])
{
col3+=3;
x = a[j-1];
a[j-1] = a[j];
a[j] = x;
flag = 1; //была перестановка, значит, еще не все
}
}
return col3;
}
Сортировка простыми вставками
int StraightInsertionSort( int *m, int n )
{
int i, j, temp, col1=0;
for (i = 1; i < n; i++)
{
temp = m[i];
for (j = i - 1; j >= 0; j--)
{
if (m[j] < temp)
break;
m[j + 1] = m[j];
m[j] = temp;
col1+=1;
}
}
return col1;
}
Другие языки программирования и технологии
Сортировки, язык Си.
Вот вам улучшенный вариант сортировки Пузырьком!
void comb_sort(double* _array, const size_t _size) {
if (_array && _size) {
size_t jump = _size;
bool swapped = true;
while (jump > 1 || swapped) {
if (jump > 1) jump = size_t(jump / 1.25);
swapped = false;
for (size_t n = 0; n + jump < _size; n++) {
if (_array[n] > _array[n + jump]) {
swap(_array[n], _array[n + jump]);
swapped = true;
}
}
}
}
}
void comb_sort(double* _array, const size_t _size) {
if (_array && _size) {
size_t jump = _size;
bool swapped = true;
while (jump > 1 || swapped) {
if (jump > 1) jump = size_t(jump / 1.25);
swapped = false;
for (size_t n = 0; n + jump < _size; n++) {
if (_array[n] > _array[n + jump]) {
swap(_array[n], _array[n + jump]);
swapped = true;
}
}
}
}
}
Вот накидал "Пирамидальную сортировку".
#include <stdio.h>
#include <stdlib.h>
// функция восстановления свойства бинарной кучи
void __heapify(int* arr, int i, int cnt) {
int t, l, r, large;
while(1){
l = i*2 + 1;
r = i*2 + 2;
if((l < cnt) && (arr[l] > arr[i]))
large = l;
else
large = i;
if((r < cnt) && (arr[r] > arr[large]))
large = r;
if(large != i){
t = arr[i];
arr[i] = arr[large];
arr[large] = t;
i = large;
} else
break;
}
}
// Пирамидальная сортировка
void heap_sort(int* arr, int cnt){
int t, i;
// в начале из массива делаем make-heap
for(i = cnt/2-1; i >= 0; --i)
__heapify(arr, i, cnt);
//pop_min
for(i = cnt - 1; i >= 0; --i) {
t = arr[0];
arr[0] = arr[i];
arr[i] = t;
__heapify(arr, 0, i);
}
}
int main(void){
int i;
int arr[] = { 100, 9, 5, 8, 1, 2, 6, 7, 4, 3, -100 };
int cnt = sizeof(arr)/sizeof(arr[0]);
heap_sort(arr, cnt);
for(i = 0; i < cnt; ++i)
printf("%d ", arr[i]);
return 0;
}
Проверка работы кода: http://ideone.com/8tMxih
#include <stdio.h>
#include <stdlib.h>
// функция восстановления свойства бинарной кучи
void __heapify(int* arr, int i, int cnt) {
int t, l, r, large;
while(1){
l = i*2 + 1;
r = i*2 + 2;
if((l < cnt) && (arr[l] > arr[i]))
large = l;
else
large = i;
if((r < cnt) && (arr[r] > arr[large]))
large = r;
if(large != i){
t = arr[i];
arr[i] = arr[large];
arr[large] = t;
i = large;
} else
break;
}
}
// Пирамидальная сортировка
void heap_sort(int* arr, int cnt){
int t, i;
// в начале из массива делаем make-heap
for(i = cnt/2-1; i >= 0; --i)
__heapify(arr, i, cnt);
//pop_min
for(i = cnt - 1; i >= 0; --i) {
t = arr[0];
arr[0] = arr[i];
arr[i] = t;
__heapify(arr, 0, i);
}
}
int main(void){
int i;
int arr[] = { 100, 9, 5, 8, 1, 2, 6, 7, 4, 3, -100 };
int cnt = sizeof(arr)/sizeof(arr[0]);
heap_sort(arr, cnt);
for(i = 0; i < cnt; ++i)
printf("%d ", arr[i]);
return 0;
}
Проверка работы кода: http://ideone.com/8tMxih
Всё фигня.. вот - главная программа
#include <iostream>
#include <conio.h>
#include "Sort.h" // - заголовочный файл созданного класса
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
system("color 0F");
Sort a;
Sort b(a);
Sort c(a);
Sort d(a);
Sort e(a);
Sort f(a);
Sort g(a);
int sravnen = 0;
int perenos = 0;
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Сортировка выбором " << endl << endl;
a.selectionsort(perenos, sravnen);
a.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Сортировка вставками " << endl << endl;
b.insertionsort(perenos, sravnen);
b.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямое включение " << endl << endl;
c.SortNoBarrier(perenos, sravnen);
c.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямой обмен (сортировка пузырьком) " << endl << endl;
d.DirectExchange(perenos, sravnen);
d.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямой выбор" << endl << endl;
e.DirectSelection(perenos, sravnen);
e.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Шейкерная сортировка " << endl << endl;
f.ShakerSort(perenos, sravnen);
f.show_array(perenos, sravnen);
int left = 0;
int right = e.get_size() - 1;
sravnen = 0;
perenos = 0;
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Быстрая сортировка " << endl << endl;
g.sort_quick(left, right, sravnen, perenos);
g.show_array(perenos, sravnen);
_getch();
return 0;
}
#include <iostream>
#include <conio.h>
#include "Sort.h" // - заголовочный файл созданного класса
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
system("color 0F");
Sort a;
Sort b(a);
Sort c(a);
Sort d(a);
Sort e(a);
Sort f(a);
Sort g(a);
int sravnen = 0;
int perenos = 0;
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Сортировка выбором " << endl << endl;
a.selectionsort(perenos, sravnen);
a.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Сортировка вставками " << endl << endl;
b.insertionsort(perenos, sravnen);
b.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямое включение " << endl << endl;
c.SortNoBarrier(perenos, sravnen);
c.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямой обмен (сортировка пузырьком) " << endl << endl;
d.DirectExchange(perenos, sravnen);
d.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Прямой выбор" << endl << endl;
e.DirectSelection(perenos, sravnen);
e.show_array(perenos, sravnen);
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Шейкерная сортировка " << endl << endl;
f.ShakerSort(perenos, sravnen);
f.show_array(perenos, sravnen);
int left = 0;
int right = e.get_size() - 1;
sravnen = 0;
perenos = 0;
cout << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-" << endl;
cout << " Быстрая сортировка " << endl << endl;
g.sort_quick(left, right, sravnen, perenos);
g.show_array(perenos, sravnen);
_getch();
return 0;
}
Похожие вопросы
- Сортировка простыми вставками. Язык Си.
- Язык СИ. Массивы Ребят, как на Си написать сортировку массива от меньшего к большему?
- Помогите с массивом и сортировкой методом пузырька в языке Си! Прогу надо сдать в пятницу срочно, не знаю как начать!
- Сортировка Структур по Алфавиту (Язык Си)
- Почему язык СИ такой сложный?
- Программирование на языке СИ с использованием подпрограммы-функции
- Программирование на языке Си. Нужна небольшая помощь.
- какую программу лучше использовать для программирования на языке Си?
- методы сортировок на Си
- Вопросы по языку СИ