冒泡排序 C# 提供额外的价值

Bubble Sort C# giving an extra value

我试图制作一个冒泡排序算法,但是当我输出按顺序排序的值时,它在开始时给了我一个额外的值,这个值不在我的数组中,但我不知道如何解决这个问题。

例如,当我 运行 程序和数组是:8, 3, 68, 74, 67, 82, 82, 18, 48, 53

排序后的值显示:60, 3, 8, 18, 48, 53, 67, 68, 74 ,82, 82

public static void Main(string[] args)
{
    int n = 10; //10 values in array
    Random r = new Random();

    int[] a; //array
    int temp;
    int i;
    a = new int[n + 1];
    a[0] = 1; //starts at 0

    for (i = 0; i <= n; i++) // set the array up
        a[i] = r.Next(1, 100); // + random numbers 

    for (i = 1; i <= n; i++)
        Console.WriteLine(a[i] + " "); // outputs the numbers of array

    Console.WriteLine();
    Console.ReadLine();

    for (i = 1; i <= n; i++)
    {
        for (int k = 1; k < a.Length - 1; k++) // n - 1 passes
        {
            if (a[k] > a[k + 1])
            {
                temp = a[k + 1]; //stores temporarily
                a[k + 1] = a[k];
                a[k] = temp;
            }
        }
    }

    Console.WriteLine("Array is sorted: ");
    foreach (int number in a) Console.Write(number + " ");
    Console.Read();
}

制作所有循环:

for(int SOMETHING = 0; ...

没有

for(int SOMETHING = 1; ...

最后一次尝试像之前的尝试一样打印出数组(使用从 1 开始的索引而不是 foreach)


C# 中的数组从 0 开始。根据我的评论;您从索引 1 开始对数组进行填充和排序,但是最后一次打印数组时,您使用了一个 foreach,它将包含第 0 个(第一个)元素,您没有在前面的部分打印或排序算法

这是您的代码的修正版本:

public static void Main(string[] args)
{
    int n = 10; //10 values in array
    Random r = new Random();

    int[] a = new int[n]; //array

    for (int i = 0; i < a.Length; i++) // set the array up
        a[i] = r.Next(1, 100); // + random numbers 

    foreach(int x in a)
        Console.WriteLine(x + " "); // outputs the numbers of array

    Console.WriteLine();
    Console.ReadLine();

    for (int i = 0; i < a.Length - 1; i++) 
    {
        for (int j = 0; j < a.Length - 1; j++) 
        {
            if (a[j] > a[j + 1])
            {
                int temp = a[j + 1]; //stores temporarily
                a[j + 1] = a[j];
                a[j] = temp;
            }
        }
    }

    Console.WriteLine("Array is sorted: ");
    foreach (int number in a) 
      Console.Write(number + " ");
    Console.Read();
}

这是正在发生的事情:

  1. 执行此操作时,您正在用 11 个元素初始化数组:

    int n = 10;  
    int[] a = new int[n + 1];  // n + 1 is 11, so this creates an 11-element array
    
  2. 然后当你填充数组时,你从0循环到10,填充所有11个索引:

    for (i = 0; i <= n; i++)
    a[i] = r.Next(1, 100);`
    
  3. 但是,当您对数组进行排序时,您会忽略第一个元素(在索引 0 处),因为您的循环总是以 1 开头,例如:

    for (i = 1; i <= n; i++)
    {
        for (int k = 1; k < a.Length - 1; k++)
        {
            // Sort the elements here
        }
    }
    
  4. 但是在最后,你输出了 ALL 个元素,所以你可以看到排序过程中跳过的第一个数字:

    foreach (int number in a) Console.Write(number + " ");
    

为了解决这个问题,通常在遍历数组时,我们从索引 0 开始,当我们的索引变量小于数组长度时循环:

for (i = 0; i < a.Length; i++)

这将始终确保您遍历数组中的每个项目。

我会考虑更支持 Linq 的方法:

using System;
using System.Collections.Generic;
using System.Linq;

namespace BubbleSort
{
    class Program
    {
        static readonly Random rnd = new Random();
        static void Swap(IList<int> list, int indexA, int indexB)
        {
            int tmp = list[indexA];
            list[indexA] = list[indexB];
            list[indexB] = tmp;
        }
        static void Main(string[] args)
        {
            var array = Enumerable.Range(1, 10).Select(r => rnd.Next(1,100)).ToArray();

            Console.WriteLine("Unsorted array:" + String.Join(" ", array.Select(x => x.ToString())));

            // array.Sort(); // probably not allowed
            for (int i = 0; i < array.Count() - 1; ++i)
            {
                for (int j = 0; j < array.Count() - 1; ++j)
                {
                    if (array[j] > array[j + 1]) Swap(array, j, j + 1);
                }
            }

            Console.WriteLine("Sorted array:" + String.Join(" ", array.Select(x => x.ToString())));
        }
    }
}

请注意,您的冒泡排序算法处于效率最低的形式,总是重复 n-1 次。检查 Wikipedia 以获得一些优化提示。例如

var swapped = true;
while (swapped)
{
    swapped = false;
    for (int i = 0; i < array.Count() - 1; ++i)
    {
        if (array[i] > array[i + 1])
        {
            Swap(array, i, i + 1);
            swapped = true;
        }
    }
}