用排序算法说明团结球的排序过程

时间:2018-05-26 17:44:20

标签: c# sorting unity3d swap

我想用两个替换球来说明两个排序的过程。就像在这张图片中一样; illustration但是Balls,你可以帮我做吗?

循环内部应该有一些延迟用于说明过程,但是我无法正确地进行操作,当我单击排序按钮时,Unity会让人感到烦恼。

随机化后,randomized balls的面是5 3 2 4 1,所以它应该排序5 - 3并显示排序然后排序2 - 5然后4 - 5,以便更换需要说明。

我有其他排序算法,如选择和泡泡,但我可以自己做,我想如果我能得到答案。

Buttons

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;


namespace Assets
{
    class Gameobjects : MonoBehaviour
    {
        public Button s_YourButton;
        [SerializeField]

        public GameObject[] Balls = new GameObject[5];


        public GameObject[] instantiatedObjects= new GameObject[5];

        void Start()
        {
            Button btn = s_YourButton.GetComponent<Button>();
            //Calls the TaskOnClick method when you click the Button
            btn.onClick.AddListener(TaskOnClick);
            Balls[0] = GameObject.Find("5");
            Balls[1] = GameObject.Find("3");
            Balls[2] = GameObject.Find("2");
            Balls[3] = GameObject.Find("4");
            Balls[4] = GameObject.Find("1");
        }
        List<Vector3> vectorList = new List<Vector3>();

        void Update()
        {
            performInsertionSort(instantiatedObjects); 
        }
        void TaskOnClick()
        {
            Fill();
            //instantiatedObjects = instantiatedObjects.OrderBy(go => go.name).ToList();
            //performInsertionSort(instantiatedObjects);
            //for (int i = 0; i < instantiatedObjects.Length; i++)
            //{
            //    instantiatedObjects[i].transform.position = vectorList[i];
            //}
            string name = "1";
            string name1 = "2";
            string name2 = "3";
            string name3 = "4";
            string name4 = "5";

            GameObject go1 = GameObject.Find(name);
            GameObject go2 = GameObject.Find(name1);
            GameObject go3 = GameObject.Find(name2);
            GameObject go4 = GameObject.Find(name3);
            GameObject go5 = GameObject.Find(name4);
            //if the tree exist then destroy it
            if (go1 & go2 & go3 & go4 & go5)
            {
                Destroy(go1.gameObject);
                Destroy(go2.gameObject);
                Destroy(go3.gameObject);
                Destroy(go4.gameObject);
                Destroy(go5.gameObject);

            }
        }

        private void performInsertionSort(GameObject[] instantiatedObjects)
        {
            {
                int k = 0;
                for (int i = 0; i < instantiatedObjects.Length - 1; i++)
                {
                    int j = i + 1;

                    while (j > 0)
                    {
                        if (string.Compare(instantiatedObjects[j - 1].name, instantiatedObjects[j].name) > 0)
                        {
                            GameObject temp = instantiatedObjects[j - 1];
                            instantiatedObjects[j - 1] = instantiatedObjects[j];
                            instantiatedObjects[j] = temp;

                            while (k < instantiatedObjects.Length){

                                instantiatedObjects[k].transform.position = vectorList[k];
                        }
                            k++; 

                        }

                        j--;

                    }
                    StartCoroutine(Example());
                }
            }
        }
        IEnumerator Example()
        {
            print(Time.time);
            yield return new WaitForSeconds(0.5f);
            print(Time.time);
        }

public void Fill()
{
    vectorList.Clear();
    instantiatedObjects = new GameObject[5];
    for (int i = 0; i < Balls.Length; i++)
    {
        GameObject spawnedObject = Instantiate(Balls[i]) as GameObject;
        instantiatedObjects[i] = spawnedObject ;
        vectorList.Add(spawnedObject.transform.position);
    }
}
        }
    }

1 个答案:

答案 0 :(得分:0)

你的代码中有很多错误

第一个:你不应该写

                `for (int i = 0; i < instantiatedObjects.Length - 1; i++)`

改为写

                for (int i = 0; i < instantiatedObjects.Length; i++)

没有-1 Beacuse长度从1开始计数,所以如果你在数组中有五个元素,它将返回5并且循环将完成5次,所以如果你想添加-1你应该输入

                    for (int i = 0; i <= instantiatedObjects.Length - 1; i++)

等于或小于符号(&lt; =)

第二个:您不应该输入While j > 0 因为它被认为是无限循环J = 0 + 1所以j&gt; 0 如果j仍然大于零,那么它会在while循环中执行所有代码,然后一次又一次地执行所有代码,这就是为什么统一冻结 无限循环的例子是:

int x = 0;
while(1 > 0)
{
    x++;
}

它永远不会出现在那两个括号中,因为它是一个无限循环 有限循环的例子:

int x = 0;
while(x < 10)
{
    x++
}

它是一个有限循环,因为在11个循环之后x将等于11并且11大于10所以它将转到脚本中的其余代码

第三个您应该在函数开头键入StartCoroutine(Example());

第四个你应该调用fixedUpdate内的函数而不是Update因为它内部有一个corutine而且使用start()总是更好只排序一个因为如果您使用fixedupdte它会对它进行一次排序然后它会一次又一次地检查它而不是结束