桶排序 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
相关文章推荐
- 在O(n log n)时间内使用常数空间复杂度对链表进行排序
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- ver[SIZE]保存的是[iBegin,iBegin+SIZE-1]区间的值,且无重复,请以O(N)时间复杂度和O(1)空间复杂度进行排序
- 数据结构8种排序时间和空间复杂度对比
- 题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。
- 某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间
- java 快速排序 时间复杂度 空间复杂度 稳定性
- 数据结构之 排序---折半插入排序(时间复杂度 O(nlog2 n) )
- (C# 版描述)插入排序算法以及排序时间的测试 ---数据结构
- 排序算法之 基数排序 及其时间复杂度和空间复杂度
- 有N个大小不等的自然数(1--N),请将它们由小到大排序。要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
- 各种排序时间空间复杂度稳定性分析
- C# 对 list<T>中的数据按某字段的大小进行排序
- 时间复杂度和空间复杂度[数据结构]
- 排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
- java 快速排序 时间复杂度 空间复杂度 稳定性
- (C# 版描述)冒泡排序算法以及排序时间的测试 ---数据结构
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- )RGB排序,一个字符串,里面只有三种字符R G B,所有的R都在G的前面,所有的G都在B的前面。将给定字符串按照此规律排序。要求不允许用辅助空间,复杂度控制在O(N)。遍历一遍就排好序。
- 数据挖掘算法的空间复杂度与时间复杂度分析