位图排序

在《编程珠玑》上看到的,开篇第一个问题,有很多数,小于一个MAXNUM,没有重复的,怎么排序最快。

答案是位图排序. 如果某一位不为0,那么这一位存代表一个数,位数(在序列中的位置)代表这个数。

比方说这些数都存在数组a,然后利用一个数组b,b初始状态各位都为0,然后读取a,如果a[1]=2,那么b[2]为1,a[3]=6,那么b[6]=1。

实现如下:

 1 #include <iostream>
 2 #include <fstream>
 3 #include<stdlib.h>
 4 #include<vector>
 5 #define MAXNUM 200
 6 int Isood(int n);
 7
 8 using namespace std;
 9
10
11 int main(void)
12 {
13     vector<int> v1,v2;
14     int n;
15     cin>>n;
16     int m;
17     m=MAXNUM;
18     while(n)
19     {
20         int t;
21         cin>>t;
22         v1.push_back(t);
23         n--;
24     }
25
26     while(m)
27     {
28         v2.push_back(0);
29         m--;
30     }
31
32     for(int i=0;i<v1.size();i++)
33     {
34         v2[v1[i]-1]=1;
35     }
36
37     for(int i=0;i<v2.size();i++)
38     {
39         if(v2[i])
40         {
41             cout<<i+1;+
42         }
43     }
44
45 }
时间: 2024-12-29 07:09:54

位图排序的相关文章

[数据结构]利用位图排序

[cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #define INT_BY_BIT 32 #define MASK 0x1F #define SHIFT 5 #define N 1000000 int a[N/INT_BY_BIT+1]; void set_bit(int x) {a[x>>SHIFT] |= 1 << (x & MASK);} void clear_bit(i

【每日算法】计数&amp;基数&amp;桶&amp;位图排序-简介

在前面的文章中,我们介绍的都是基于比较的排序. 对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的). 本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用. 计数排序 想象下面这种情况: 一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列,也就是说,最高的站在标号为k的位置,最矮的站在标号为1的位置. 那么对于每个人,如何知

计数排序与位图排序

计数排序(Counting sort)是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置.计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.计数排序更适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(

位图排序(位图技术应用)

1.  问题描述 给定不大于整数 n 的 k 个互不相等的整数 ( k <n ) , 对这些整数进行排序.本文讨论的内容具体可参见<编程珠玑>(第二版)的第一章. 2.  问题分析 关于排序,已经有多种排序方法了:插入排序,归并排序,快速排序,希尔排序等.每种排序都有不同的用武之地.为什么需要位图排序呢?所有的内部排序(上述所提及)都必须一次性将所有排序元素载入内存.假如有1000,000个整数,每个整数4字节,则意味着,至少需要4000,000B 约为 4MB 的内存空间, 如果仅仅只

【算法思想】位图排序算法

问题的提出 一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序? 常规思想 我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据.由于输入文件最大可能有10^7个数据,因此可以通过遍历输入文件40次来完成排序.第一次将在[0,249 999]范围内的整数读入到内存中,第二次将在[250 000,499 999]范围内的整数读入到内存中,依此类推.每读入

Go语言实现位图排序

Go语言提供了byte类型,一个byte对应8个位,所以转换一下就可以实现位图了. 代码: package main //author:xcl //date:2014-1-25 import ( "fmt" ) func main() { arrInt32 := [...]uint32{5, 4, 2, 1, 3, 17, 13} var arrMax uint32 = 20 bit := NewBitmap(arrMax) for _, v := range arrInt32 { b

位图排序思想及代码详解

输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.如果在输入文件中有任何重复整数出现就是致命错误.没有其他数据与该整数相关联 输出:按升序排列的 输入整数的列表. 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用.运行时间最多几分钟,运行时间为10秒就不需要进一步优化了.          从0开始解决这个问题的话,可以把它分为两个部分:首先随机生成K个小于N的数:再对这K个数排列.          系统参数:GCC:#pragma pack(4)    

PHP实现 bitmap 位图排序 求交集

2014年12月16日 17:15:09 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这个二进制串,并将为1的位转换成整数,顺序存放到新的集合中,就是排好序的了 排序代码: 1 function sort() 2 { 3 // var_dump(PHP_INT_MAX, PHP_INT_SIZE); 4 // int 9223372036854775807 5 // int 8 6 $bitmap = array_

C 实现位图排序

应用场景: 1到N的不重复乱序数据,乱序数据总最大不超过N,需要高效的排序. sorr.c #include <stdio.h> #include <stdlib.h> #include <string.h> #define mask 0x1F #define shift 5 /************************** * function name: bitVect * description :according size to malloc memor