1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 28
1

Quick Sort, рекурсия

15.10.2013, 15:03. Показов 1941. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с рекурсией, пишу Быструю Сортировку, все нормально работает до второго вызова рекурсии
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace qSort
{
    class Program
    {
        static void qSort(int[] array, int start, int end)
        {
 
            if (start >= 0 && end > start)
            {
                
                int k = 1;
 
                while (start != end)
                {
                    if (k % 2 == 0)
                    {
                        if (array[start] > array[end])
                        {
                            int x = array[start];
                            array[start] = array[end];
                            array[end] = x;
 
                            end--;
                            k++;
                        }
                        else
                            start++;
                    }
                    else
                        if (array[start] > array[end])
                        {
                            int x = array[start];
                            array[start] = array[end];
                            array[end] = x;
 
                            start++;
                            k++;
                        }
                        else
                            end--;
 
                }
 
               
                qSort(array, 0, start - 1);
 
                qSort(array, end + 1, array.Length - 1);
 
 
            }
            else
            {
                return;
            }
        }
 
 
        static void Main()
        {
            int[] array = {5,2,1,7,4,8,1};
            qSort(array, 0, array.Length-1 );
            foreach (int i in array)
                Console.Write(i);
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2013, 15:03
Ответы с готовыми решениями:

IndexOutOfRangeExeption в алгоритме Quick Sort
Доброго времени суток! Кто-то может подсказать, пожалуйста, в чем проблема? Мучаюсь 2-й день....

Quick sort
!Хелпаните с сортировкой выдает ошибку ! USES Windows;...

Quick sort c++
Добрый день. Есть вопрос, как можно реализовать Quick sort с подсчётом перестановок. По условию...

Сортировка Quick Sort
Можно написать код и коментами.

11
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
15.10.2013, 15:21 2
Lordik192, зачем такие извращения?
C#
1
2
3
4
int[] array = { 5, 2, 1, 7, 4, 8, 1 };
Array.Sort(array);
foreach (int i in array)
    Console.Write(i);
0
valera_21
15.10.2013, 15:23
  #3

Не по теме:

Цитата Сообщение от Smems Посмотреть сообщение
Lordik192, зачем такие извращения?
мне кажется, что такие извращения нужны преподавателям :D

0
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 28
15.10.2013, 15:25  [ТС] 4
у меня задание в университете по алгоритмам, нужно самостоятельно реализовать
0
Администратор
Эксперт .NET
9413 / 4699 / 759
Регистрация: 17.04.2012
Сообщений: 9,542
Записей в блоге: 14
15.10.2013, 15:32 5
Smems, хорошо что добрый дядя из Microsoft написал метод сортировки, а если дяди потом не будет, как Lordik192 будет код писать?
0
154 / 153 / 29
Регистрация: 21.05.2010
Сообщений: 338
15.10.2013, 15:39 6

Не по теме:

tezaurismosis, вы ещё скажите, что не нужно пользоваться готовыми библиотеками, паттернами и т.д. И компилятор свой нужно писать. А вдруг все исчезнут? Я же не знаю, для чего товарищу Lordik192. Вдруг он не знает про готовые методы.


А по делу: Lordik192, вот вам алгоритмы, пользуйтесь.
1
606 / 581 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
15.10.2013, 15:45 7
не уверен что этот алгоритм можно причислить к быстрым (по моему их вообще штуки 3 общеизвестных), но он всяко быстрее чем изначальный со встроенными While() =)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        static void qSort(int[] array, int start)
        {
            if (start < array.Length)
            {
                int min = array[start];
 
                for(int i=start; i < array.Length; i++)
                    if (min > array[i])
                    {
                        min = array[i];
                        array[i] = array[start];
                        array[start] = min;
                    }
 
                qSort(array, ++start);
            }
            else return;
        }
 
 
        static void Main()
        {
            int[] array = { 5, 2, 1, 7, 4, 8, 1 };
            qSort(array, 0);
            foreach (int i in array)
                Console.Write(i);
 
            Console.ReadLine();
        }
    }
0
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 28
15.10.2013, 15:49  [ТС] 8
спасибо, я их уже видел, когда искал код с qsort, но мне интересно самому ее написать, и сравнить различие в скорости выполнения. Но у меня вышла проблема с рекурсией в моем методе и мне интересно, что в ней не так, все еще надеюсь, что кто-то поможет.

Добавлено через 2 минуты
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
не уверен что этот алгоритм можно причислить к быстрым (по моему их вообще штуки 3 общеизвестных), но он всяко быстрее чем изначальный со встроенными While() =)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        static void qSort(int[] array, int start)
        {
            if (start < array.Length)
            {
                int min = array[start];
 
                for(int i=start; i < array.Length; i++)
                    if (min > array[i])
                    {
                        min = array[i];
                        array[i] = array[start];
                        array[start] = min;
                    }
 
                qSort(array, ++start);
            }
            else return;
        }
 
 
        static void Main()
        {
            int[] array = { 5, 2, 1, 7, 4, 8, 1 };
            qSort(array, 0);
            foreach (int i in array)
                Console.Write(i);
 
            Console.ReadLine();
        }
    }
Спасибо, но я сейчас разбираюсь именно с qSort, а Вы мне предлагаете нечто другой алгоритм
0
606 / 581 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
15.10.2013, 16:13 9
проблема в том, что алгоритм не работает © КЭП

просто подумай сам, после первого вызова алгоритма срабатывает цикл While(), который даже не хочу понимать что делает, после того цикл пройдёт наконец по всем эллементам, и по моему даже не по одному разу, этот же метод сортировки вызывается ещё 2 раза, в каждом из которых присуствует как цикл While(), так и ещё пара вызовов этого же метода...

Добавлено через 4 минуты
по коду:
это явно китайский подход:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if (k % 2 == 0)
                    {
                        if (array[start] > array[end])
                        {
                            int x = array[start];
                            array[start] = array[end];
                            array[end] = x;
 
                            end--;
                            k++;
                        }
                        else
                            start++;
                    }
                    else
                        if (array[start] > array[end])
                        {
                            int x = array[start];
                            array[start] = array[end];
                            array[end] = x;
 
                            start++;
                            k++;
                        }
                        else
                            end--;
делает то-же самое, а места занимает в 2 раза меньше:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (array[start] > array[end])
                    {
                        int x = array[start];
                        array[start] = array[end];
                        array[end] = x;
 
                        
                        k++;
                    }
                    else
                    {
                        if (k % 2 == 0) start++;
                        else end--;
                    }
Добавлено через 6 минут
как я уже упоминал, даже еслиб это работало, оно слишком ужасно:
Цитата Сообщение от Lordik192 Посмотреть сообщение
C#
1
2
qSort(array, 0, start - 1); 
qSort(array, end + 1, array.Length - 1);
а вообще, минимально изменённый ваш код вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace qSort
{
    class Program
    {
        static void qSort(int[] array, int start, int end)
        {
 
            if (start >= 0 && end > start)
            {
                while (start <= end)
                {
                    if (array[start] > array[end])
                    {
                        int x = array[start];
                        array[start] = array[end];
                        array[end] = x;
                    }
                    else start++;
                }
                qSort(array, 0, --end);
            }
            else
            {
                return;
            }
        }
 
 
        static void Main()
        {
            int[] array = { 5, 2, 1, 7, 4, 8, 1 };
            qSort(array, 0, array.Length-1);
            foreach (int i in array)
                Console.Write(i);
 
            Console.ReadLine();
        }
    }
}
почему не нужно сначала проходить циклом по всем эллементам массива, а потом вызывать этот же метод рекурсивно ещё 2(!) раза вам предподаватель расскажет, я такое даже представить не мог)
0
tezaurismosis
15.10.2013, 16:22
  #10

Не по теме:

Smems, такую чушь пороть не буду, это неверный вывод из моих слов. Программист должен знать как работают алгоритмы, компиляторы и пр. поэтому студентов заставляют их изучать и писать. Ну а по поводу того, что вы не сразу поняли, что это студент ... пусть будет так. :mda:

0
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 28
15.10.2013, 16:24  [ТС] 11
мой цикл While() выполняет нахождение абсолютной позиции элементом и поэтому он выполняется в самом начале, цикл проходит через все элементы лишь единожды. То что у меня "китайский" подход это не удивительно, я его только начал писать и еще не оптимизировал.

По поводу двойного рекурсивного вызова, то алгоритм qSort сам собой подразумевает разбиение массива на 2 части и отдельную их сортировку, то что Вы предлагаете не совсем соответствует алгоритму, который я стремлюсь реализовать
0
606 / 581 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
15.10.2013, 16:42 12
хм... по правде говоря терзаюсь сомнениями, куда же вас послать, то ли на фриланс, то ли к терапевту...
вам указали где ошибка, вам указали пару вариантов решения проблемы, а вы весь такой "а я хочу по другоооому..."
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 16:42
Помогаю со студенческими работами здесь

Quick sort using vectors
Now that you have learned about three sorting algorithms with quadratic time complexity (Bubble,...

Quick sort Java
Что такое Quick sort in Java? С чем его едят? Может у кого будут более менее понятные примеры по...

Нахождения медианы quick sort
При попытке найти медиану процесс начинает грузить процессор. Деббагер показывает на линию, где...

Реализация алгоритма Quick sort
пожалуйсто напишите алгоритм Quick sort


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

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

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