// コールバックとして、ソート済みリストとダーティフラグを、配列(且つ参照型)で返す. /// <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); }
/// <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(); } }
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); }