如何实现C#中的桶排序算法
桶排序(Bucket Sort)是一种排序算法,它将待排序的元素根据其大小分到不同的桶中,每个桶再分别进行排序。然后将各个桶中的元素按照顺序合并到一起,即可得到有序的结果。桶排序的时间复杂度为O(n),在某些特定情况下,甚至可以达到线性排序的效率。
下面将介绍如何在C#中实现桶排序算法,给出具体的代码示例:
using System;
using System.Collections.Generic;
class BucketSort
{
/// <summary>
/// 桶排序算法实现
/// </summary>
/// <param name="data">待排序的数组</param>
public static void Sort(double[] data)
{
if (data == null || data.Length <= 1)
{
return;
}
int bucketCount = data.Length;
List<double>[] buckets = new List<double>[bucketCount];
for (int i = 0; i < bucketCount; i++)
{
buckets[i] = new List<double>();
}
// 将数据分配到各个桶中
for (int i = 0; i < data.Length; i++)
{
int bucketIndex = (int)(data[i] * bucketCount);
buckets[bucketIndex].Add(data[i]);
}
// 对每个桶中的数据进行插入排序
for (int i = 0; i < bucketCount; i++)
{
InsertionSort(buckets[i]);
}
// 合并各个有序桶中的数据
int dataIndex = 0;
for (int i = 0; i < bucketCount; i++)
{
for (int j = 0; j < buckets[i].Count; j++)
{
data[dataIndex++] = buckets[i][j];
}
}
}
/// <summary>
/// 插入排序算法实现
/// </summary>
/// <param name="data">待排序的数组</param>
private static void InsertionSort(List<double> data)
{
for (int i = 1; i < data.Count; i++)
{
double temp = data[i];
int j = i - 1;
while (j >= 0 && data[j] > temp)
{
data[j + 1] = data[j];
j--;
}
data[j + 1] = temp;
}
}
}
class Program
{
static void Main(string[] args)
{
double[] data = { 0.5, 0.2, 0.8, 0.3, 0.6, 0.1, 0.9, 0.7, 0.4 };
Console.WriteLine("原始数组:");
PrintData(data);
BucketSort.Sort(data);
Console.WriteLine("排序后的数组:");
PrintData(data);
}
/// <summary>
/// 打印数组元素
/// </summary>
/// <param name="data">待打印的数组</param>
private static void PrintData(double[] data)
{
foreach (var item in data)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}