冒泡排序 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();
}
这是正在发生的事情:
执行此操作时,您正在用 11
个元素初始化数组:
int n = 10;
int[] a = new int[n + 1]; // n + 1 is 11, so this creates an 11-element array
然后当你填充数组时,你从0
循环到10
,填充所有11个索引:
for (i = 0; i <= n; i++)
a[i] = r.Next(1, 100);`
但是,当您对数组进行排序时,您会忽略第一个元素(在索引 0
处),因为您的循环总是以 1
开头,例如:
for (i = 1; i <= n; i++)
{
for (int k = 1; k < a.Length - 1; k++)
{
// Sort the elements here
}
}
但是在最后,你输出了 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;
}
}
}
我试图制作一个冒泡排序算法,但是当我输出按顺序排序的值时,它在开始时给了我一个额外的值,这个值不在我的数组中,但我不知道如何解决这个问题。
例如,当我 运行 程序和数组是: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();
}
这是正在发生的事情:
执行此操作时,您正在用
11
个元素初始化数组:int n = 10; int[] a = new int[n + 1]; // n + 1 is 11, so this creates an 11-element array
然后当你填充数组时,你从
0
循环到10
,填充所有11个索引:for (i = 0; i <= n; i++) a[i] = r.Next(1, 100);`
但是,当您对数组进行排序时,您会忽略第一个元素(在索引
0
处),因为您的循环总是以1
开头,例如:for (i = 1; i <= n; i++) { for (int k = 1; k < a.Length - 1; k++) { // Sort the elements here } }
但是在最后,你输出了 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;
}
}
}