Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++]Сортировки, Сортировка Шелла и вложенная погружения 
V
    Опции темы
maxnsk82
Дата 20.1.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



Задание:Сортировка Шелла. Частичную сортировку с заданным шагом, начиная с заданного  элемента оформить в виде функции. Алгоритм частичной сортировки - вставка погружением.

Кое что есть, функция сортировки погружением работает, но нужно что бы она была в сортировке Шелла...я так думаю что с переменной step не как надо обращаюсь:

Код

# include <stdio.h>
# include <conio.h>

const int sz=10;//размер массива

void sort(int B[],int step);
void sortShell(int A[]);

void main()
{
    
    printf ("Input %d numbers: ",sz);
    int A[sz];
    for (int i=0;i<sz;i++)
    {
        scanf_s ("%d",&A[i]);//ввод массива пользователем
    }
    sortShell(A);                         //если вызвать sort(A), то выдаёт упорядоченный массив
    printf ("\n\nUporjadochennyj massiw: ");
    for (int j=0;j<sz;j++)
    printf ("%d ",A[j]);//вывод упорядоченного массива
    _getch();
}

void sortShell(int A[])
{
    int sh=8;//первоначальный шаг сортировки Шелла
    int step=0;
    int B[20];//массив используемый для сортировки
    while (sh>=1)
    {    
        for (int i=0;i<sh;i++)
        {
            for (int j=0,k=i;k<sz;j++,k+=sh)
            {
                B[j]=A[k];//занисим в В эелементы из А с заданным шагом
                step++;
            }
            sort(B,step);//сортируем погружением
            for (int j=0,k=i;k<sz;j++,k+=sh)
            {
                A[k]=B[j];//возвращаем из В упорядоченные элементы в А
            }
            step=0;        
        }if (sh=1) break;
        sh/=2;
    }
}

void sort(int B[],int step)//функция сортировки погружением
{
    int i,j,tmp; 
    for (i=1;i<step;i++)
        {tmp = B[i];
        for (j=i;j>0;j--)
            if(B[j-1]>tmp)
            {
                B[j]=B[j-1];
                B[j-1]=tmp;
            }
            else break;
        }
    
}

PM MAIL   Вверх
t_gran
Дата 21.1.2010, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Ну сам (рабочий) алгоритм Шелла выглядит так:
Код

void SortShell (int arr[], int size)
{
   int step= size/2;
   while (step > 0)
   {
      for (int i= step; i < size; i++)
      {
         int j;
         int buff= arr[i];
         for (j= i - step; (j >= 0) && (arr[j] > buff); j-= step)
            arr[j+step]= arr[j];
         arr[j+step]= buff;
      }
      step/= 2;
   }
}


Но учитывая, что вам алгоритм частичной сортировки нужно выполнить отдельно, то я не могу взять в толк, почему у функции sort передаётся всего 2 параметра а не 3? Ведь кроме самого массива и шага, нужно знать правую стартовую границу. + Ко всему вы должны били реализовать частичную, а не полную сортировку, т.е. переместить правый элемент ниже, на своё место, и всё.

В общем результат должен быть примерно таким:
Код

//----------------------------------------------//
void Sort (int arr[], int pos, int step)
{
   int j;
   int buff= arr[pos];
   for (j= pos - step; (j >= 0) && (arr[j] > buff); j-= step)
      arr[j+step]= arr[j];
   arr[j+step]= buff;
}
//----------------------------------------------//
void SortShell (int arr[], int size)
{
   for (int step= size/2; step > 0; step/= 2)
      for (int pos= step; pos < size; pos++)
         Sort(arr, pos, step);
}
//----------------------------------------------//


Это сообщение отредактировал(а) t_gran - 21.1.2010, 05:16


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
maxnsk82
Дата 21.1.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 27.6.2009

Репутация: нет
Всего: нет



Спасибо за помощь. Работает и похоже так как требуется)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.