Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/65: Рейтинг темы: голосов - 65, средняя оценка - 4.55
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
1

Сортировка Слияния не через рекурсию!!

01.04.2011, 19:01. Показов 12103. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, выручайте, срочно надо сделать сортировку СЛИЯНИЯ не через рекурсию... я ее вот так сделал
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
private void LocalSort(int[] mass, int l, int r)
        { 
            if (l >= r) 
                return;
 
            int m = (l + r) / 2;
            LocalSort(mass, l, m);
            LocalSort(mass, m + 1, r);
            Merge(mass, l, m, r);
        }
 
        private void Merge(int[] mass, int l, int m, int r)
        {
            if (m + 1 > r) return;
 
            int[] b = new int[mass.Length];
            
            for (int i = l; i != m + 1; i++)
            {
                b[i] = mass[i];
            }
 
            for (int i = m + 1; i != r + 1; i++)
            {
                b[i] = mass[r + m + 1 - i];
            }
 
            int k = l; 
            int j = r; 
            for (int i = l; i != r + 1; i++)
            {
                Comparing(k, j); 
                if (b[k] <= b[j])
                {
                    UnPermutation(i, j);
                    mass[i] = b[k++];
                    Permutation(i, j);
                }
                else
                {
                    UnPermutation(i, j);
                    mass[i] = b[j--];
                    Permutation(i, j);
                }
            }
        }
А надо чтобы через перестановки....( я ваще в недоумении как это сделать? и ваще реально ли?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2011, 19:01
Ответы с готовыми решениями:

Быстрая сортировка (quick sort) НЕ через рекурсию
Добрый день, переписал алгоритм быстрой сортировки с wiki, переделал под свою задачу, на малом...

[Standard ML] Быстрая сортировка через хвостовую рекурсию
Нужной темы не нашел, поэтому пишу здесь. У меня такая проблема - нужна функция быстрой сортировки...

Сортировка методом слияния
Народ помогите с сортировкой списка слиянием! Вот нашел код в интернете но не как не могу...

Сортировка методом слияния
Применяя сортировку методом слияния, отсортировать массив, файл, список, элементами которых ...

10
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
01.04.2011, 21:51 2
http://ru.wikibooks.org/wiki/П... и_слиянием
0
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
02.04.2011, 18:31  [ТС] 3
а на C# можно это перевести нормально? чтобы без возврата массива
0
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
02.04.2011, 19:16 4
Цитата Сообщение от Temoxa Посмотреть сообщение
чтобы без возврата массива
какого возвтрата?
0
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
02.04.2011, 21:30  [ТС] 5
ну вот то что ты мне ссылку кинул, там пример Слияния без рекурсии возвращает массив тебе! А мне не надо чтобы возвращал(

Добавлено через 1 час 57 минут
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
template <class T>
T* merge(T *m1, T* m2, int l1, int l2){
    T* ret = new T[l1+l2];
    int n = 0;
    // Сливаем массивы, пока один не закончится
    while (l1 && l2){
        if (*m1 < *m2){
           ret[n] = *m1;
           m1++; l1--;}
        else {
           ret[n] = *m2;
           m2++; l2--;}
       n++;}
    // Если закончился первый массив
    if (l1 == 0){
        for (int i=0; i<l2; i++){
            ret[n++] = *m2++;}}
    // Если закончился второй массив
    else {
        for (int i=0; i<l1; i++){
           ret[n++] = *m1++;}}
    return ret;}
 
// Функция восходящего слияния
template <class T>
void mergeSort(T * mas, int len){
    int n=1, l, ost;
    T * mas1;
    while (n<len){
        l=0;
        while (l<len){
           if (l+n >= len) break;
           ost = (l+n*2>len) ? (len-(l+n)) : n;
           mas1 = merge(mas+l, mas+l+n, n, ost);
           for (int i=0; i<n+ost; i++) mas[l+i] = mas1[i];
           delete [] mas1;
           l+=n*2;}
       n*=2;
}}
Как это переделать в C# ? помогите пожалуйста... !! я замаялся ужо
0
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
03.04.2011, 00:25 6
Цитата Сообщение от Temoxa Посмотреть сообщение
Слияния без рекурсии возвращает массив тебе
А что нужно чтоб делал? вот он рассортировал, а дальше что?
Вставте код функции merge прямо в цыкл на место где эта функция вызывается, и будет тада все в одном
0
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
03.04.2011, 12:13  [ТС] 7
Проблема в том что надо на C# переписать!) С++ там по другому совсем с массивами работают.... как на шарп?

Добавлено через 2 часа 8 минут
Неужели никто не может из C++ в шарп переделать?(
0
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
03.04.2011, 12:45 8
вто ссылке что я вам дал, там же есть пример на шрпае

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
static Int32[] Merge_Sort(Int32[] massive)
        {
            if (massive.Length == 1)
                return massive;
            Int32 mid_point = massive.Length / 2;
            return Merge(Merge_Sort(massive.Take(mid_point).ToArray()), Merge_Sort(massive.Skip(mid_point).ToArray()));
        }
 
        static Int32[] Merge(Int32[] mass1, Int32[] mass2)
        {
            Int32 a = 0, b = 0;
            Int32[] merged = new int[mass1.Length + mass2.Length];
            for (Int32 i = 0; i < mass1.Length + mass2.Length; i++)
            {
                if (b < mass2.Length && a < mass1.Length)
                    if (mass1[a] > mass2[b] && b < mass2.Length)
                        merged[i] = mass2[b++];
                    else
                        merged[i] = mass1[a++];
                else
                    if (b < mass2.Length)
                        merged[i] = mass2[b++];
                    else
                        merged[i] = mass1[a++];
            }
            return merged;
        }
 
    static void Main(string[] args)
        {
              Int32[] arr = new Int32[100];
              //заполняем массив случайными числами
              Random rd = new Random();
              for(Int32 i = 0; i < arr.Length; ++i) {
                 arr[i] = rd.Next(1, 101);
              }
              System.Console.WriteLine("The array before sorting:");
              foreach (Int32 x in arr)
              {
                 System.Console.Write(x + " ");
              }
              //сортировка
 
              arr = Merge_Sort(arr);
 
              System.Console.WriteLine("\n\nThe array after sorting:");
              foreach (Int32 x in arr)
              {
                 System.Console.Write(x + " ");
              }
              System.Console.WriteLine("\n\nPress the <Enter> key");
              System.Console.ReadLine();
        }
0
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
03.04.2011, 18:56  [ТС] 9
да мне не такой надо, мне надо по образцу C++!! Смысл ваще сделать в сортировке Слияния ПЕРЕСТАНОВКИ чтобы были, а не рефлексия

Добавлено через 6 часов 0 минут
Ну парни!! что такие бездушные то? я бы сам перевел если бы знал, другой помощи как от вас не от кого получитЬ!!
0
10 / 10 / 3
Регистрация: 19.03.2010
Сообщений: 679
Записей в блоге: 2
05.04.2011, 07:41  [ТС] 10
Ребята, тема еще в силе... тот код который вверху перевести на шарп! плз
0
0 / 0 / 0
Регистрация: 03.04.2011
Сообщений: 83
14.06.2011, 14:43 11
Temoxa,
нужен ли еще код сортировки слиянием через итерацию???
(у меня, кажется, есть)...
0
14.06.2011, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2011, 14:43
Помогаю со студенческими работами здесь

Нисходящая сортировка методом слияния
Добрый день ребята!!! Мне нужно сделать нисходящею сортировку методом слияния! Я набросал...

Сортировка массива по методу слияния
Надо сделать программу, которая опредиляет время сортировки по методу слияния : делать...

Сортировка массива методом слияния
Ввести массив А. В массив В перенести все элементы массива А, стоящие правее максимального...

сортировка посредством вставок и слияния
прочёл кнута но не понял каким образом выбирать элементы и куда пихать элемент который остается....


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru