C# 버전 Next_Permutation (C++의 next_permutation)

양비밀이·2020년 8월 16일
0
        static bool Next_Permutation<T> (List<T> list) where T : IComparable
        {
            Action<int,int> Swap = (int idx1, int idx2) => { T temp = list[idx1]; list[idx1] = list[idx2]; list[idx2] = temp; }; 
            int a= 0, b = 0, p = 0; //p : pivot
            for(int i=list.Count-2 ; i>=0;--i)
                if(list[i].CompareTo(list[i+1])<0)
                {
                    a = i;
                    p = i + 1;

                    for(int j=list.Count-1; j>=0; --j)
                        if(list[a].CompareTo(list[j])<0)
                        {
                            b = j;
                            break;
                        }

                    Swap(a, b);

                    for(int j=0; j<(list.Count-p)/2; j++)
                        Swap(j + p, list.Count - j - 1);

                    return true;
                }
            // 이미 순서대로 정렬되어 있음 => 역순으로 뒤집
            for(int i=0;i<list.Count/2;i++)
                Swap(i, list.Count - i- 1);
            return false;
        }

그냥 내가 쓰려고 만들어봄.

0개의 댓글