我正在使用气泡排序算法对从文本文件获得的浮点值列表进行排序。此气泡排序代码适用于其他数组,但不适用于此数组;它仅显示文本文件中的第一个值。
我已经在现有数组上使用了这种气泡排序并且它有效,但它不适用于我从字符串转换的浮点数组。为什么这行不通?
while(line != null)
{
int temp = 0;
for (int write = 0; write < x.Length; write++)
{
for (int sort = 0; sort < x.Length - 1; sort++)
{
if (x[sort] > x[sort + 1])
{
temp = (int)x[sort + 1];
x[sort + 1] = x[sort];
x[sort] = temp;
}
}
}
for (int i = 0; i < x.Length; i += 1)
{
Console.Write(x[i] + " ");
}
line = br.ReadLine();
Console.ReadKey();
}
下面是将字符串转换为 x 值的代码:
string line = br.ReadLine();
float [] x = Array.ConvertAll(line.Split(','), float.Parse);
以下是执行文件转换的代码:
using (StreamReader br = new StreamReader("file.txt"))
除了你可以用一行(Array.Sort(x(,它使用更有效的快速排序(来按顺序获取数组之外,你在那里(1(不是气泡排序,(2(只能对整数正常工作。您的临时交换变量是一个整数,因此交换时值将始终转换为整数。你需要这样的东西:
public class BubbleSort<T> where T : IComparable<T>
{
public static T[] Sort(T[] array)
{
for (var i = array.Length - 1; i > 0; i--)
{
for (var j = 0; j < i; j++)
{
if (((IComparable<T>)array[j]).CompareTo(array[j + 1]) > 0)
{
var swapVar = array[j + 1];
array[j + 1] = array[j];
array[j] = swapVar;
}
}
}
return array;
}
}
像这样使用它:
BubbleSort<float>.Sort(x);
将阵列 (X( 加载到内存中后。请注意,它可以对任何可以与其自身(在本例中为 float(进行比较的内容进行排序。
稍微修改一下:
public static class BubbleSort
{
public static T[] Sort<T>(T[] array) where T : IComparable<T>
{
for (var i = array.Length - 1; i > 0; i--)
{
for (var j = 0; j < i; j++)
{
if (((IComparable<T>)array[j]).CompareTo(array[j + 1]) > 0)
{
var swapVar = array[j + 1];
array[j + 1] = array[j];
array[j] = swapVar;
}
}
}
return array;
}
}
将自动推断数组的类型,因此
BubbleSort.Sort(x);
将工作