Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
1

Сортировка методом прямого включения

09.09.2010, 22:50. Показов 15054. Ответов 12
Метки нет (Все метки)

Нашел блок-схему, написал по ней метод сортировки, но, первый элемент в нем не сортируется, помогите, пожалуйста, найти ошибку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void Sort(double[] array)
        {
            for (int i = 2; i < array.Length; i++)
            {
                double x = array[i];
                array[0] = x;
                int j = i;
                while (x < array[j - 1])
                {
                    array[j] = array[j - 1];
                    j--;
                }
                array[j] = x;
            }
        }
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2010, 22:50
Ответы с готовыми решениями:

Сортировка методом прямого включения, исправить код
Сортировка методом прямого включения. using System; using System.Collections.Generic; using...

Исследование алгоритмов сортировки методом прямого включения и методом Шелла
Здравствуйте. Мне нужно написать программу в C# на тему &quot;Исследование алгоритмов сортировки методом...

Cортировка методом прямого слияния
сортировка методом прямого слияния

Отсортировать массив методом прямого выбора
Ввести с консоли массив целых чисел и отсортировать его методом прямого выбора. Вот код: ...

12
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
09.09.2010, 23:05 2
от 1 цикл. в C# массивы с 0.
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
09.09.2010, 23:07  [ТС] 3
Rockedit, пробовал менять, все равно первый элемент не отсортирован
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
09.09.2010, 23:09 4
array[0] = x; вот из за этого.
1
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
09.09.2010, 23:11  [ТС] 5
Rockedit, да, действительно, без этого все сортируется нормально, но почему в лекциях указано так? И, раз есть эта строка, в том языке тоже массивы идут с 0. Удаление этой строки не "портит" метод прямого включения? =)
0
386 / 319 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
09.09.2010, 23:13 6
Посмотри на www.algolist.ru
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
09.09.2010, 23:13 7
Это ошибка в блок схеме, если знаете Delphi то,
Сортировка методом прямого включения.

Входные данные - массив и его длина.
Выходные данные - отсортированный массив.


Примеры использования:
begin
arr[5] := 13;
arr[8] := 28;
arr[9] := 35;
arr[3] := 56;
arr[7] := 62;
arr[0] := 98;
arr[6] := 123;
arr[4] := 748;
arr[1] := 834;
arr[2] := 933;

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
for i := 0 to 9 do begin
write(arr[i]); write(' ');
end;
writeln;
 
easySort(arr, 10);
 
for i := 0 to 9 do begin
write(arr[i]); write(' ');
end;
writeln;
end.
Результат работы:

98 834 933 56 748 13 123 62 28 35
13 28 35 56 62 98 123 748 834 933

Код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type myArray = array[0..20] of integer;
procedure easySort( var arr : myArray; const length : integer );
var i, j, item : integer;
begin
for i := 1 to length-1 do begin
item := arr[i];
j := i;
while item < arr[j-1] do begin
arr[j] := arr[j-1];
j := j-1;
end;
arr[j] := item;
end;
end;
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
09.09.2010, 23:16  [ТС] 8
А, нет, теперь появляется исключение Индекс находился вне границ массива. в выделенной строке:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void Sort(double[] array)
        {
            for (int i = 1; i < array.Length; i++)
            {
                double x = array[i];
                //array[0] = x;
                int j = i;
[B]                while (x < array[j - 1])[/B]
                {
                    array[j] = array[j - 1];
                    j--;
                }
                array[j] = x;
            }
        }
Массив вида:
C#
1
2
3
4
5
6
            double[] ar = new double[10];
            Random rnd = new Random();
            for (int i = 0; i < ar.Length; i++)
            {
                ar[i] = Math.Round(rnd.NextDouble(), 3);
            }
Добавлено через 1 минуту
Rockedit, нет, делфи к сожалению не знаю
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
09.09.2010, 23:24 9
Попробуйте от 2 цикл
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
09.09.2010, 23:43  [ТС] 10
Все равно, цикл while достигает -1

Добавлено через 18 минут
Переписал тот метод с делфи, вроде бы понял все верно, но в цикле while снова эксепшен.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        private void newsort(double[] a)
        {
            int i, j;
            double item;
            for (i = 1; i < a.Length; i++)
            {
                item = a[i];
                j = i;
                while (item < a[j - 1])
                {
                    a[j] = a[j - 1];
                    j--;
                }
                a[j] = item;
            }
        }
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
09.09.2010, 23:47 11
да видать и он кривой, просто если попробовать отсортировать 1 2 3 будет исключение...т.к. 1 < 2 j-- будет.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void newsort(double[] a)
        {
            int i, j;
            double item;
            for (i = 1; i < a.Length; i++)
            {
                item = a[i];
                j = i;
                while (item < a[j - 1])
                {
                    a[j] = a[j - 1];
                    if(j!=1) j--;
                }
                a[j] = item;
            }
        }
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
10.09.2010, 00:02  [ТС] 12
Вот, нашел алгоритм:
C#
1
2
3
4
5
6
7
8
9
10
11
        private void newsort(double[] arr)
        {
            for (int i = 1; i < arr.Length; i++)
            {
                double tmp = arr[i];
                int j;
                for (j = i - 1; j >= 0 && arr[j] > tmp; j--)
                    arr[j + 1] = arr[j];
                arr[j + 1] = tmp;
            }
        }
0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
23.11.2017, 12:40 13
А помогите добавить к этому алгоритму счётчик перестановок.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2017, 12:40
Помогаю со студенческими работами здесь

Написать программу, которая методом прямого выбора сортирует по убыванию введённый с клавиатуры массив
Здравствуйте, вот написал программу по сортировки массива по убыванию, но в нем надо чтобы значения...

Сортировка методом обмена и методом быстрой сортировки
Помогите пожалуйста написать программный код метода обмена и метода быстрой сортировки)

Сортировка линейным методом (методом отбора)
Пожалуйста, помогите найти ошибку. Нужно отсортировать одномерный массив НЕ по возрастанию линейным...

Сортировка методом прямого включения
Помогите переделать програ,помогитемму. Она у меня сортирует чиса,записанныев файл, по убыванию....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru