1

Тема: Сортування злиттям по спаданню

Який код? Всюди по зростанню(

2

Re: Сортування злиттям по спаданню

по зростанню це ASC

3

Re: Сортування злиттям по спаданню

А в чому складність переробити існуючий код? По ідеї, достатньо десь замінити < на > чи щось назразок...

4

Re: Сортування злиттям по спаданню

muhasjo написав:

по зростанню це ASC

що таке ASC?

5 Востаннє редагувалося Mister (01.04.2016 00:07:17)

Re: Сортування злиттям по спаданню

P.Y. написав:

А в чому складність переробити існуючий код? По ідеї, достатньо десь замінити < на > чи щось назразок...

public int[] merge3(int[] mass1, int[] mass2)
{
    int a = 0, b = 0;
    merged = new int[mass1.Length + mass2.Length];
    for (int 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;
}

поставте, а то щось в мене не вийшло

6

Re: Сортування злиттям по спаданню

Якщо це робочий код для сортування за зростанням, то, очевидно, 8-й рядок, замість

mass1[a] > mass2[b]

треба

mass1[a] < mass2[b]

, більш я не бачу, де елементи в цьому коді порівнюються.

7

Re: Сортування злиттям по спаданню

Mister написав:

Який код? Всюди по зростанню(

:o  :|  *FACEPALM*

Потрібно зрозуміти алгоритм і питання відпаде.

Подякували: leofun011

8 Востаннє редагувалося leofun01 (01.04.2016 11:25:16)

Re: Сортування злиттям по спаданню

Ось робочий код:

using System;
using System.Globalization;

namespace Sort
{
    public static class Program
    {
        public static void Main()
        {
            float[] array = InputArray();
            float[] sorted = SortMerge<float>(array,
                (a, b) => a < b ? 1 : a > b ? -1 : 0);
            Console.Write("Sorted array :");
            foreach(float v in sorted)
                Console.Write(" {0}", v);
            Console.WriteLine();
            Console.WriteLine("Press enter to exit.");
            Console.ReadLine();
        }
        public static float[] InputArray()
        {
            bool invalid;
            string[] s;
            int i, len;
            float[] array;
            do
            {
                invalid = false;
                Console.Write("Input array : ");
                s = Console.ReadLine().Split(new[] { ' ', ';' },
                    StringSplitOptions.RemoveEmptyEntries);
                len = s.GetLength(0);
                array = new float[len];
                for(i = 0; i < len; ++i)
                {
                    try
                    {
                        array[i] = float.Parse(s[i], CultureInfo.InvariantCulture);
                    }
                    catch(FormatException)
                    {
                        invalid = true;
                        Console.WriteLine("Cannot parse string to array. Try again.");
                        break;
                    }
                }
            }
            while(invalid);
            return array;
        }
        public static T[] SortMerge<T>(T[] array, Comparison<T> comparison)
        {
            int len = array.GetLength(0);
            T[] copy = new T[len];
            array.CopyTo(copy, 0);
            Merge<T>(copy, 0, ++len / 2, --len / 2, comparison);
            return copy;
        }
        public static void Merge<T>(T[] array, int start,
            int len1, int len2, Comparison<T> comparison)
        {
            int i1 = start, i2 = start + len1, len = len1 + len2, i = 0, c;
            if(len1 > 1) Merge<T>(array, i1, ++len1 / 2, --len1 / 2, comparison);
            if(len2 > 1) Merge<T>(array, i2, ++len2 / 2, --len2 / 2, comparison);
            T[] copy = new T[len];
            len1 += i1; len2 += i2;
            while(i1 < len1 && i2 < len2)
            {
                c = comparison(array[i1], array[i2]);
                if(c <= 0) copy[i++] = array[i1++];
                if(c >= 0) copy[i++] = array[i2++];
            }
            while(i1 < len1) copy[i++] = array[i1++];
            while(i2 < len2) copy[i++] = array[i2++];
            copy.CopyTo(array, start);
        }
    }
}

Сортує по спаданню.
Якщо потрібно по зростанню, просто міняєте критерій порівняння (11-12 рядки):

            float[] sorted = SortMerge<float>(array,
                (a, b) => a > b ? 1 : a < b ? -1 : 0);

upd:

P.Y. написав:

А в чому складність переробити існуючий код? По ідеї, достатньо десь замінити < на > чи щось назразок...

Складності немає, просто всім подобається халява.

Mister написав:
muhasjo написав:

по зростанню це ASC

що таке ASC?

asc - ascending - зростання
desc - descending - спадання

Подякували: Master_Sergius, mike, sasha2763