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