Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2015, 13:27   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Сортировка последовательности относительно середины

Нашел в литературе алгоритм сортировки относительно середины массива.

Но он работает не для всех последовательностей. К примеру если применить этот алгоритм к
Код:
int a[]={5,10,7,6,3,9,4,8,12};
средний элемент тут имеет значение 3

то после применения алгоритма получим 3 10 7 6 5 9 4 8 12 число 10 явно не в той части .

Код:
#include <iostream>
using namespace std;
 
void qsort (int a[], int lef, int rit);
 
int main() 
{
    int a[]={5,10,7,6,3,9,4,8,12};
    for (int i=0;i<9;i++) cout<< a[i]<<" "; cout<< endl;
    qsort (a, 0, 8);
    for (int i=0;i<9;i++) cout<< a[i]<<" "; cout<< endl;
    return 0;
}
 
void qsort (int a[], int lef, int rit)
{
int ir, rm, buf; // ir – для индекса среднего элемента
// текущей части массива.
// rm – для значения среднего
// элемента текущего массива.
// buf – для промежуточных значений
// обрабатываемой информации.
int l1, r1; // l1 – для индекса элемента, который
// расположен левее и
// больше среднего.
// r1 – для индекса элемента, который
// расположен правее и
// меньше среднего.
int i; // i – для управляющего параметра цикла.
l1 = lef; // Определяем начальный индекс текущей
// части массива.
r1 = rit; // Определяем конечный индекс текущего
// массива.
ir = (l1+r1)/2; // Определяем индекс среднего элемента
// текущей части массива.
rm = a[ir]; // В rm пересылаем значение среднего
// элемента текущего массива.
do // Цикл для перебора элементов, которые
// находятся левее и правее среднего
// элемента текущей части массива.
{
while ( a[l1] < rm ) l1++; // Находим 1-й элемент, который лежит
// слева и больше среднего элемента.
// Индекс этого элемента фиксируется
// в переменной l1.
while ( a[r1] > rm ) r1--; // Находим 1-й элемент, который лежит
// справа и больше среднего элемента.
// Индекс этого элемента фиксируется
// в переменной r1.
if ( l1 <= r1 ) // Начало перестановки элементов
// массива. Меньший относительно
// среднего переставляем в позицию l1,
// а больший относительно среднего
// переставляем в позицию r1 и директивами
// l1++; и r1++; переходим к рассмотрению
// следующих элементов, расположенных
// соответственно левее и правее среднего элемента.
{
// Переставляем элементы массива.
buf = a[l1];
a[l1] = a[r1];
a[r1] = buf;
l1++;
r1--;
} // Конец перестановки элементов массива.
}
while ( r1 > l1 );
}
http://ideone.com/BuhKKh
RAFA91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка пузырьком по возрастанию последовательности слов Jess Mailes Помощь студентам 0 13.05.2012 18:57
Сортировка и последовательности скромница2012 Паскаль, Turbo Pascal, PascalABC.NET 2 17.04.2012 16:38
Сортировка и последовательности Nick_Martel Помощь студентам 0 16.12.2011 03:43
Сортировка последовательности (си) Pascaler Помощь студентам 1 01.06.2011 15:12
сортировка числовой последовательности по возрастанию Solniffko Паскаль, Turbo Pascal, PascalABC.NET 7 14.11.2008 08:36