C# 中的桶排序 - 怎么做?
Bucket sort in C# - how to?
static void Main(string[] args)
{
double[] array = { 0.37, 0.25, 0.86, 0.23, 0.09, 0.21, 0.17, 0.71 };
double[] sortedArray =BucketSort(array);
// PrintResult(sortedArray);
}
public double[] BucketSort(double[] array)
{
List<List<double>> buckets = new List<List<double>>();
InitializeBuckets(buckets);
Scatter(array, buckets);
int i = 0;
foreach (List<double> bucket in buckets)
{
double[] arr = bucket.ToArray();
InsertionSort(arr);
foreach (double d in arr)
{
array[i++] = d;
}
}
return array;
}
private void Scatter(double[] array, List<List<double>> buckets)
{
foreach (double value in array)
{
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
}
}
private void InsertionSort(double[] array)
{
int j;
double temp;
for (int i = 1; i < array.Length; i++)
{
j = i;
while (j > 0 && array[j] < array[j - 1])
{
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
j--;
}
}
}
private int GetBucketNumber(double value)
{
double val = value * 10;
int bucketNumber = (int)Math.Floor(val);
return bucketNumber;
}
private static void InitializeBuckets(List<List<double>> buckets)
{
for (int i = 0; i < 10; i++)
{
List<double> a = new List<double>();
buckets.Add(a);
}
}
我收到一个错误
An Object reference is required for the non static field, method or property
谁能解决这个问题并解释一下?
将静态关键字添加到您的方法中。更改这些方法:
- 桶排序
- 分散
- 插入排序
- 获取桶号
示例:
public static double[] BucketSort(double[] array)
Main
方法是一个静态方法,这意味着您可以在没有对象实例的情况下调用它。其余方法是实例方法,因此您需要一个 class 的实例,在其中声明它们才能调用它们。
如果方法不访问来自 class 的非静态字段和方法
可以让它静态化,使其使用更灵活。所以在您的代码中,如果您将所有方法设为静态,错误就会消失。
public static double[] BucketSort(double[] array)
{
...
}
或者,您可以创建对象的实例并以这种方式调用它。 ?假设包含的 class 是 Program
并且它有一个默认的构造函数,你的代码将是:
var program = new Program();
double[] sortedArray = program.BucketSort(array);
static void Main(string[] args)
{
double[] array = { 0.37, 0.25, 0.86, 0.23, 0.09, 0.21, 0.17, 0.71 };
double[] sortedArray =BucketSort(array);
// PrintResult(sortedArray);
}
public double[] BucketSort(double[] array)
{
List<List<double>> buckets = new List<List<double>>();
InitializeBuckets(buckets);
Scatter(array, buckets);
int i = 0;
foreach (List<double> bucket in buckets)
{
double[] arr = bucket.ToArray();
InsertionSort(arr);
foreach (double d in arr)
{
array[i++] = d;
}
}
return array;
}
private void Scatter(double[] array, List<List<double>> buckets)
{
foreach (double value in array)
{
int bucketNumber = GetBucketNumber(value);
buckets[bucketNumber].Add(value);
}
}
private void InsertionSort(double[] array)
{
int j;
double temp;
for (int i = 1; i < array.Length; i++)
{
j = i;
while (j > 0 && array[j] < array[j - 1])
{
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
j--;
}
}
}
private int GetBucketNumber(double value)
{
double val = value * 10;
int bucketNumber = (int)Math.Floor(val);
return bucketNumber;
}
private static void InitializeBuckets(List<List<double>> buckets)
{
for (int i = 0; i < 10; i++)
{
List<double> a = new List<double>();
buckets.Add(a);
}
}
我收到一个错误
An Object reference is required for the non static field, method or property
谁能解决这个问题并解释一下?
将静态关键字添加到您的方法中。更改这些方法:
- 桶排序
- 分散
- 插入排序
- 获取桶号
示例:
public static double[] BucketSort(double[] array)
Main
方法是一个静态方法,这意味着您可以在没有对象实例的情况下调用它。其余方法是实例方法,因此您需要一个 class 的实例,在其中声明它们才能调用它们。
如果方法不访问来自 class 的非静态字段和方法 可以让它静态化,使其使用更灵活。所以在您的代码中,如果您将所有方法设为静态,错误就会消失。
public static double[] BucketSort(double[] array)
{
...
}
或者,您可以创建对象的实例并以这种方式调用它。 ?假设包含的 class 是 Program
并且它有一个默认的构造函数,你的代码将是:
var program = new Program();
double[] sortedArray = program.BucketSort(array);