您的位置:首页 > 编程语言 > C#

桶排序 C# 0(1)的辅助空间,o(n)的时间复杂度进行排序,数据量有上万条。

2015-01-26 11:09 549 查看
</pre><pre code_snippet_id="589148" snippet_file_name="blog_20150126_1_6516364" name="code" class="csharp">protected void Page_Load(object sender, EventArgs e){int[] arr = new int[]{ 10, 5, 1, 2, 9, 8, 6, 4, 7, 3,2,2,33,4,55 };// { 11, 13, 14, 6, 4, 12, 8, 11, 12, 9, 12 };Print(arr);Response.Write("<br>");arr = bucketSort(arr);Print(arr);}
 void Print(int[] a){for (int i = 0; i < a.Length; i++){Response.Write(a[i].ToString()+" ");}}/// <summary>/// 桶排序/// </summary>/// <param name="arr"> 要排序的数组 </param>/// <returns> 排序后的数组 </returns>private static int[] bucketSort(int[] arr){int max = arr.Max();int elementsNumber = arr.Length;// 初始化桶LinkedList<int>[] bucket = new LinkedList<int>[arr.Length];for (int i = 0; i < elementsNumber; i++){bucket[i] = new LinkedList<int>();}// 元素分装各个桶中for (int i = 0; i < elementsNumber; i++){int bucketIndex = arr[i] * elementsNumber / (max + 1);InsertIntoLinkList(bucket[bucketIndex], arr[i]);}// 从各个桶中获取后排序插入int index = 0;for (int i = 0; i < elementsNumber; i++){foreach (var item in bucket[i]){arr[index++] = item;}}return arr;}/// <summary>/// 按升序插入 linklist/// </summary>/// <param name="linkedList"> 要排序的链表 </param>/// <param name="num"> 要插入排序的数字 </param>private static void InsertIntoLinkList(LinkedList<int> linkedList, int num){// 链表为空时,插入到第一位if (linkedList.Count == 0){linkedList.AddFirst(num);return;}else{int length = linkedList.Count;for (int i = 0; i < length; i++){if (linkedList.ElementAt(i) > num){LinkedListNode<int> node = linkedList.Find(linkedList.ElementAt(i));linkedList.AddBefore(node, num);return;}}linkedList.AddLast(num);}}
测试通过。桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响,速度是比较快的。步骤:设置一个定量的阵列当作空桶子。寻访序列,并且把项目一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把项目再放回原来的序列中。理解:例如待排数字 [6 2 4 1 5 9],准备10个空桶,最大数个空桶[6 2 4 1 5 9] 待排数组[0 0 0 0 0 0 0 0 0 0] 空桶[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)1. 顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ][6 2 4 1 5 9] 待排数组[0 0 0 0 0 0 6 0 0 0] 空桶[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)2. 顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶[6 2 4 1 5 9] 待排数组[0 0 2 0 0 0 6 0 0 0] 空桶[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)3. 剩余元素过程一样,全部入桶后变成下边这样[6 2 4 1 5 9] 待排数组[0 1 2 04 5 6 0 0 9] 空桶[0 1 2 34 5 6 7 8 9] 桶编号(实际不存在)4. 0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐