桶排序

桶排序是一种快速排序的算法。也是一种采用分治思想的算法。主要思路就是将所有的数据根据大小的不同放到不同的桶当中,桶从小到大排列,对每个桶里面的元素进行排序后,再合并桶就完成排序了。


static void Main(string[] args)
{
    //构造10w条随机的数据
    Random r = new Random();
    int[] datas = new int[100000];
    for (int i = 0; i < 100000; i++) {
        datas[i] = r.Next(1, 100000);
    }
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    List<int> res =  TongSort(datas);
    stopwatch.Stop();

    foreach (var data in res) {
        Console.WriteLine(data);
    }

    Console.WriteLine("用时:" + stopwatch.ElapsedMilliseconds);

    Console.ReadKey();

}

static List<int> TongSort(int[] datas) {
    int length = datas.Length;
    //根据数据长度计算桶的数量
    int num = (int)Math.Log(length) + 1;
    List<int>[] lists = new List<int>[num];//新建这么多个桶

    //初始化桶
    for (int init = 0; init < lists.Length; init++) {
        lists[init] = new List<int>();
    }

    //确定区间,用最大和最小值
    int min = 0, max = 0;
    for (int i = 0; i < length; i++) {
        if (min > datas[i])
        {
            min = datas[i];
        }
        else {
            if (max < datas[i])
                max = datas[i];
        }
    }
    int section = (max - min) / num + 1;

    int index = 0;
    foreach (int data in datas) {
        //确定元素,属于哪个桶的下标,添加到桶里
        index = data / section;
        lists[index].Add(data);
    }

    List<int> result = new List<int>();

    //对所有桶分别排序,再合并
    for (int j = 0; j < lists.Length; j++) {
        lists[j].Sort();//不知道是不是快排
        result.AddRange(lists[j]);
    }

    return result;
}


对10w条随机数据的排序需要时间:9-11ms


首页 我的博客
粤ICP备17103704号