Ejemplo n.º 1
0
        // コールバックとして、ソート済みリストとダーティフラグを、配列(且つ参照型)で返す.
        /// <summary>
        /// ソート関数
        /// </summary>
        /// <param name="sort_item">ソートを行う配列(これが直接書き換えられます)</param>
        /// <param name="comparer">ソートルール:Compare(x,y)が正ならばxが後に来るように定義してください</param>
        /// <param name="i_one_sort_cb">
        /// 一回の動作(主に値の入れ替えと入れ替え判定)で呼ばれるコールバック。
        /// 第一引数は、交換が行われたか否か。第二引数は交換された場合のダーティフラグ。
        /// </param>
        /// <param name="i_complete_cb">ソートが完了したときに呼ばれるコールバック</param>
        /// <param name="sort_type">ソートの種類</param>
        public void Sort(T[] sort_item, Comparer <T> comparer,
                         SortParameter <T> sort_parameter, Sorting.SortType sort_type)
        {
            IEnumerator enumerator = SortUseIEnumerator(sort_item, sort_parameter, new WaitForSeconds(0), sort_type);

            RunIEnumerator(enumerator);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// ソート関数
        /// </summary>
        /// <param name="sort_item">ソートを行う配列(これが直接書き換えられます)</param>
        /// <param name="comparer">ソートルール:Compare(x,y)が正ならばxが後に来るように定義してください</param>
        /// <param name="i_one_sort_cb">
        /// 一回の動作(主に値の入れ替えと入れ替え判定)で呼ばれるコールバック。
        /// 第一引数は、交換が行われたか否か。第二引数は交換された場合のダーティフラグ。
        /// </param>
        /// <param name="i_complete_cb">ソートが完了したときに呼ばれるコールバック</param>
        /// <param name="i_wait_for_second">一回のソートで待つ条件</param>
        /// <param name="sort_type">ソートの種類</param>
        /// <returns></returns>
        public IEnumerator SortUseIEnumerator(
            T[] sort_item,
            SortParameter <T> sort_parameter,
            WaitForSeconds i_wait_for_second, Sorting.SortType sort_type)
        {
            waiter = i_wait_for_second;
            if (sort_item.Length > 1)
            {
                yield return(IEnumStartSort(sort_item, sort_parameter, sort_type));

                sort_parameter.cb_complete();
            }
        }
Ejemplo n.º 3
0
        private IEnumerator IEnumStartSort(T[] sort_item, SortParameter <T> sort_parameter, SortType sortType)
        {
            dirty_items = new SortItemState[sort_item.Length];
            sort_parameter.cb_action(SortState.Start, sort_item, dirty_items);
            switch (sortType)
            {
            case SortType.Buble:
                if (sort_parameter is BubleSortParameter <T> )
                {
                    yield return(IEnumBubleSort(sort_item, sort_parameter as BubleSortParameter <T>));
                }
                else
                {
                    //エラーを入れたい
                }
                break;

            case SortType.Insert:
                break;

            case SortType.Bitonic_NotUseGPGPUDemo:
                if (sort_parameter is BytonicSortParameter <T> )
                {
                    if (Mathf.IsPowerOfTwo(sort_item.Length))
                    {
                        yield return(IEnumBitonicNotUseGPGPUDemo(sort_item, sort_parameter as BytonicSortParameter <T>, 0, sort_item.Length));
                    }
                    else
                    {
                        //アイテム数の、べき乗切り上げ.
                        int itemlength_pow2 = Mathf.NextPowerOfTwo(sort_item.Length);
                        //アイテム数の、べき乗切り上げの指数.
                        int itemlength_log2 = Mathf.RoundToInt(Mathf.Log(itemlength_pow2, 2));
                        //最大値探索
                        int max_index = 0;
                        for (int k = 1; k < sort_item.Length; ++k)
                        {
                            if (sort_parameter.comparer.Compare(sort_item[k], sort_item[max_index]) > 0)
                            {
                                max_index = k;
                            }
                        }
                        //2の冪要素数の配列作成
                        T[] sort_item_org = sort_item;
                        sort_item = new T[itemlength_pow2];
                        System.Array.Copy(sort_item_org, sort_item, sort_item_org.Length);
                        for (int k = sort_item_org.Length; k < sort_item.Length; ++k)
                        {
                            sort_item[k] = sort_item[max_index];
                        }
                        SortItemState[] dirty_items_origin = dirty_items;
                        dirty_items = new SortItemState[sort_item.Length];
                        yield return(IEnumBitonicNotUseGPGPUDemo(sort_item, sort_parameter as BytonicSortParameter <T>, 0, sort_item.Length));

                        System.Array.Copy(sort_item, sort_item_org, sort_item_org.Length);
                        System.Array.Copy(dirty_items, dirty_items_origin, dirty_items_origin.Length);
                        sort_item = sort_item_org;
                    }
                }
                break;

            case SortType.Quick:
                if (sort_parameter is QuickSortParameter <T> )
                {
                    yield return(IEnumQuickSort(sort_item, sort_parameter as QuickSortParameter <T>, 0, sort_item.Length));
                }
                break;

            case SortType.RandomQuick:
                if (sort_parameter is QuickSortParameter <T> )
                {
                    yield return(IEnumRandomQuickSort(sort_item, sort_parameter as QuickSortParameter <T>, 0, sort_item.Length));
                }
                break;
            }
            sort_parameter.cb_action(SortState.Complete, sort_item, dirty_items);
        }