Ответы пользователя по тегу Алгоритмы
  • Есть ли у кого нибудь рабочий алгоритм Плавной Сортировки на ЯП?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Код:
    кодище

    private static bool IsAscending(string A, string B)
    {
    	return (StringType.StrCmp(A, B, false) <= 0);
    }
    
    private static void UP(ref int IA, ref int IB, ref int temp)
    {
    	temp = IA;
    	IA += IB + 1;
    	IB = temp;
    }
    
    private static void DOWN(ref int IA, ref int IB, ref int temp)
    {
    	temp = IB;
    	IB = IA - IB - 1;
    	IA = temp;
    }
    
    private static int q, r, p, b, c, r1, b1, c1;
    private static string[] A;
    
    private static void Sift()
    {
    	int r0, r2, temp = 0;
    	string t;
    	r0 = r1;
    	t = A[r0];
    
    	while (b1 >= 3)
    	{
    		r2 = r1 - b1 + c1;
    
    		if (!IsAscending(A[r1 - 1], A[r2]))
    		{
    			r2 = r1 - 1;
    			DOWN(ref b1, ref c1, ref temp);
    		}
    
    		if (IsAscending(A[r2], t))
    		{
    			b1 = 1;
    		}
    		else
    		{
    			A[r1] = A[r2];
    			r1 = r2;
    			DOWN(ref b1, ref c1, ref temp);
    		}
    	}
    
    	if (Convert.ToBoolean(r1 - r0))
    		A[r1] = t;
    }
    
    private static void Trinkle()
    {
    	int p1, r2, r3, r0, temp = 0;
    	string t;
    	p1 = p;
    	b1 = b;
    	c1 = c;
    	r0 = r1;
    	t = A[r0];
    
    	while (p1 > 0)
    	{
    		while ((p1 & 1) == 0)
    		{
    			p1 >>= 1;
    			UP(ref b1, ref c1, ref temp);
    		}
    
    		r3 = r1 - b1;
    
    		if ((p1 == 1) || IsAscending(A[r3], t))
    		{
    			p1 = 0;
    		}
    		else
    		{
    			--p1;
    
    			if (b1 == 1)
    			{
    				A[r1] = A[r3];
    				r1 = r3;
    			}
    			else
    			{
    				if (b1 >= 3)
    				{
    					r2 = r1 - b1 + c1;
    
    					if (!IsAscending(A[r1 - 1], A[r2]))
    					{
    						r2 = r1 - 1;
    						DOWN(ref b1, ref c1, ref temp);
    						p1 <<= 1;
    					}
    					if (IsAscending(A[r2], A[r3]))
    					{
    						A[r1] = A[r3]; r1 = r3;
    					}
    					else
    					{
    						A[r1] = A[r2];
    						r1 = r2;
    						DOWN(ref b1, ref c1, ref temp);
    						p1 = 0;
    					}
    				}
    			}
    		}
    	}
    
    	if (Convert.ToBoolean(r0 - r1))
    		A[r1] = t;
    
    	Sift();
    }
    
    private static void SemiTrinkle()
    {
    	string T;
    	r1 = r - c;
    
    	if (!IsAscending(A[r1], A[r]))
    	{
    		T = A[r];
    		A[r] = A[r1];
    		A[r1] = T;
    		Trinkle();
    	}
    }
    
    public static void SmoothSort(string[] Aarg, int N)
    {
    	int temp = 0;
    	A = Aarg;
    	q = 1;
    	r = 0;
    	p = 1;
    	b = 1;
    	c = 1;
    
    	while (q < N)
    	{
    		r1 = r;
    		if ((p & 7) == 3)
    		{
    			b1 = b;
    			c1 = c;
    			Sift();
    			p = (p + 1) >> 2;
    			UP(ref b, ref c, ref temp);
    			UP(ref b, ref c, ref temp);
    		}
    		else if ((p & 3) == 1)
    		{
    			if (q + c < N)
    			{
    				b1 = b;
    				c1 = c;
    				Sift();
    			}
    			else
    			{
    				Trinkle();
    			}
    
    			DOWN(ref b, ref c, ref temp);
    			p <<= 1;
    
    			while (b > 1)
    			{
    				DOWN(ref b, ref c, ref temp);
    				p <<= 1;
    			}
    
    			++p;
    		}
    
    		++q;
    		++r;
    	}
    
    	r1 = r;
    	Trinkle();
    
    	while (q > 1)
    	{
    		--q;
    
    		if (b == 1)
    		{
    			--r;
    			--p;
    
    			while ((p & 1) == 0)
    			{
    				p >>= 1;
    				UP(ref b, ref c, ref temp);
    			}
    		}
    		else
    		{
    			if (b >= 3)
    			{
    				--p;
    				r = r - b + c;
    				if (p > 0)
    					SemiTrinkle();
    
    				DOWN(ref b, ref c, ref temp);
    				p = (p << 1) + 1;
    				r = r + c;
    				SemiTrinkle();
    				DOWN(ref b, ref c, ref temp);
    				p = (p << 1) + 1;
    			}
    		}
    	}
    }


    Вызов:
    string[] data = { "Hello", "World", "Computer", "VB.Net", "PHP" };
    SmoothSort(data, 5);


    Результат:
    Computer
    Hello
    PHP
    VB.Net
    World


    Вот тут можете больше посмотреть, а еще тут, тут и тут
    Ответ написан