方法错误地更改列表的值

时间:2017-06-28 01:06:24

标签: c# algorithm sorting insertion-sort

所以我写了一个测试代码(试图教自己如何制作排序算法),看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static string Compile (List<int> array)
        {
            string output = "";
            foreach (var item in array)
            {
                output += item.ToString() + " ";
            }
            return output;
        }

        static List<int> InsertSort(List<int> listToSort)
        {
            List<int> deliverList = new List<int>();
            deliverList = listToSort;
            int j = 0;
            int iterator = 0;
            for (int i = 1; i < deliverList.Count; i++)
            {
                j = i;
                while(j>0)
                {
                    if(deliverList[j] < deliverList[j-1])
                    {
                        int temp = deliverList[j - 1];
                        deliverList[j - 1] = deliverList[j];
                        deliverList[j] = temp;
                    }
                    Console.WriteLine("Iteration #[" + iterator.ToString() + "]: " + Compile(deliverList));
                    iterator++;
                    j--;
                }
            }
            return deliverList;
        }

        static void Main(string[] args)
        {
            List<int> unsorted = new List<int>();

            List<int> sorted = new List<int>();

            Random random = new Random();

            for (int i = 0; i < 10; i++)
            {
                unsorted.Add(random.Next(0, 100));
            }

            sorted = InsertSort(unsorted);

            Console.WriteLine("Unsorted Array: " + Compile(unsorted));
            Console.WriteLine("Sorted Array: " + Compile(sorted));

            Console.ReadKey();
        }
    }
}

出于某种原因,当我在&#34; sort&#34;上使用InsertSort方法时数组,&#34;未排序&#34;数组也被更改,输出排序的数组两次,不让我看到未排序的数组。 这里究竟发生了什么

PS:编译只是一个简单的方法,可以将列表编译成一个字符串,其中的元素用空格分隔。

2 个答案:

答案 0 :(得分:2)

您拥有代码deliverList = listToSort;,使deliverList引用与listToSort相同的列表。他们成了同义词。

相反,你应该写:

        List<int> deliverList = listToSort.ToList();

这将制作列表的副本 - 现在它们将是不同的。

您的代码现在将输出:

Iteration #[0]: 52 88 93 69 35 21 63 47 2 17 
Iteration #[1]: 52 88 93 69 35 21 63 47 2 17 
...
Iteration #[43]: 2 17 21 35 47 52 63 69 88 93 
Iteration #[44]: 2 17 21 35 47 52 63 69 88 93 
Unsorted Array: 88 52 93 69 35 21 63 47 2 17 
Sorted Array: 2 17 21 35 47 52 63 69 88 93 

答案 1 :(得分:-3)

你需要复制一份清单

        List<int> deliverList = listToSort.Select(x=>x);