12. 分配排序
2014-08-09 15:21
281 查看
分配排序
分配排序是基于分配和收集的排序方法。其基本思想是:先将待排序记录序列分配到不同的桶里,然后在把各桶中的记录依次收集在一起。
桶式排序
桶式排序是一种简单的分配排序,其基本思想是:假设带排序记录的值都在0~m-1之间,设置m个桶,首先将值为i的记录分配到第i个桶中,然后在将各个桶中的记录依次收集起来。
分配排序是基于分配和收集的排序方法。其基本思想是:先将待排序记录序列分配到不同的桶里,然后在把各桶中的记录依次收集在一起。
桶式排序
桶式排序是一种简单的分配排序,其基本思想是:假设带排序记录的值都在0~m-1之间,设置m个桶,首先将值为i的记录分配到第i个桶中,然后在将各个桶中的记录依次收集起来。
void bucketSort(int arr[], int n,int m)//n为序列中元素的个数,m为序列中最大的元素的值。 { //定义一个数组,存放各数字出现的次数。初始值均赋值为0 vector<int>times = { 0 }; times.resize(m + 1); //定义一个临时数组 int *tempArry=new int ; //统计各数字出现的次数 for (int i = 0; i<n; i++) { times[arr[i]]++; } //重新组织存放出现次数的数组 for (int i = 1; i<m + 1; i++) { times[i] += times[i - 1]; } //从后向前对元素进行收集 for (int i = n - 1; i >= 0; i--) { tempArry[--times[arr[i]]] = arr[i]; } //把临时数组中的元素复制到原数组中 for (int i = 0; i<n; i++) { arr[i] = tempArry[i]; } delete[] tempArry; }
struct Node //定义静态链表存储待排序记录序列 { int key;//键值 int next;//下一个键值在数组中的下标 }; struct QueueNode//定义静态链队列存储桶 { int front; //指向队头元素在数组中的下标 int rear; //指向队尾元素在数组中的下标 }; void Distribute(Node r[], int n, QueueNode q[], int m,int &first)//first为静态链表的头指针,从下标0开始存储带排序序列 { int i = first; int k; while (r[i].next != -1) { k = r[i].key; if (q[k].front == -1) q[k].front = i; else { r[q[k].rear].next = i; } q[k].rear = i; i = r[i].next; } //静态链表中的最后一个元素的next指必为-1,故上述循环不会对其操作 //所以在循环结束后,还需对最后一个元素进行手动操作 k = r[i].key; if (q[k].front == -1) q[k].front = i; else { r[q[k].rear].next = i; } q[k].rear = i; } void Collect(Node r[], int n, QueueNode q[], int m, int &first) { int k = 0; int last; while (q[k].front == -1) //找到第一个非空队列 { k++; } first = q[k].front; last = q[k].rear; while (k<m-1) //将所有的队列首尾相接 { k++; if (q[k].front != -1) { r[last].next = q[k].front; last = q[k].rear; } } r[last].next = -1; } void BucketSort(Node r[], QueueNode q[], int n, int m) { for (int i = 0; i<n; i++) //初始化静态链表 { r[i].next = i + 1; } r[n - 1].next = -1; for (int i = 0; i < m; i++)//初始化静态队列 { q[i].front = -1; q[i].rear = -1; } int first = 0; Distribute(r, n, q, m, first); Collect(r, n, q, m, first); while (r[first].next != -1) { cout << r[first].key << " "; first = r[first].next; } cout << r[first].key; }
相关文章推荐
- 对如下数组排序 {12,1,23,24,235,237,231,571,575,57} 排序规则如下:先找第一位,比较大的,如果相同,接着按第二位找,找第二位比较大的,依次类推,进行排序
- C和指针之动态内存分配之输入很多整数进行排序
- 分配类排序——基数排序
- 5-12 排序 (25分)
- 处理dotProject中的按“分配的用户”排序问题
- 【排序算法】分配排序(C++实现)
- 算法提高 12-2扑克排序
- C语言排序(12)___Can you find it?(Hdu 2141)
- JqGrid学习总结12_排序
- 【量化小讲堂-Python&Pandas系列12】诺奖得主的仓位分配算法,有效吗?
- spark学习12之利用keyBy对数据中其中两项进行排序
- 常用的资源分配策略有哪两种?在每一种策略中,资源请求队列的排序原则是什么?
- 使用EF6和MVC5实现一个简单的选课系统--排序、过滤和分页(3/12)
- PTA 5-12 排序 (25分)
- 排序专题之分配排序
- 分配排序 总结
- int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)
- (12)选择排序之三 堆排序
- 利用CS_BOM_EXPL_MAT_V2 展单BOM,根据排序字符串进行组件分配
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时