Pagini recente » Cod sursa (job #2294847) | Cod sursa (job #442836) | Cod sursa (job #1208792) | Cod sursa (job #2951175) | Cod sursa (job #2473853)
#include <fstream>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#define BITS 8
#define MASK ((1<<BITS)-1)
#define THRESHOLD 64
using namespace std;
/**
{1}
`-.`'.-'
`-. .-'.
`-. -./\.- .-'
-. /_|\ .-
`-. `/____\' .-'.
`-. -./.-""-.\.- '
`-. /< (()) >\ .-'
- .`/__`-..-'__\' .-
,...`-./___|____|___\.-'.,.
,-' ,` . . ', `-,
,-' ________________ `-,
,'/____|_____|_____\
/ /__|_____|_____|___\
/ /|_____|_____|_____|_\
' /____|_____|_____|_____\
.' /__|_____|_____|_____|___\
,' /|_____|_____|_____|_____|_\
,,---''--...___...--'''--.. /../____|_____|_____|_____|_____\ ..--```--...___...--``---,,
'../__|_____|_____|_____|_____|___\
\ ) '.:/|_____|_____|_____|_____|_____|_\ ( /
)\ / ) ,':./____|_____|_____|_____|_____|_____\ ( \ /(
/ / ( ( /:../__|_____|_____|_____|_____|_____|___\ ) ) \ \
| | \ \ /.../|_____|_____|_____|_____|_____|_____|_\ / / | |
.-.\ \ \ \ '..:/____|_____|_____|_____|_____|_____|_____\ / / / /.-.
(= )\ `._.' | \:./ _ _ ___ ____ ____ _ _ _ _ _ _ _ __\ | `._.' /( =)
\ (_) ) \/ \ ( (_) /
\ `----' """""""""""""""""""""""""""""""""""""""""""""" `----' /
\ ____\__ __/____ /
\ (=\ \ / /-) /
\_)_\ \ / /_(_/
\ \ / /
) ) _ _ ( (
( (,-' `-..__ __..-' `-,) )
\_.-'' ``-..____ ____..-'' ``-._/
`-._ ``--...____...--'' _.-'
`-.._ _..-'
`-..__ CIOBY KNOWS ALL __..-'
``-..____ ____..-''
``--...____...--''
{1}
*/
class writer {
public:
writer() {};
writer(const char* file_name) {
output_file.open(file_name, std::ios::out | std::ios::binary);
output_file.sync_with_stdio(false);
index &= 0;
}
template <typename T>
inline writer& operator <<(T target) {
auto inc = [&, this]() mutable {
if (++index == SIZE)
index &= 0,
output_file.write(buffer, SIZE);
};
aux &= 0;
if (target == 0) {
buffer[index] = '0';
inc();
return *this;
}
for (; target; target = target / 10)
nr[aux++] = target % 10 + '0';
for (; aux; inc())
buffer[index] = nr[--aux];
return *this;
}
inline writer& operator <<(const char* target) {
auto inc = [&, this]() mutable {
if (++index == SIZE)
index &= 0,
output_file.write(buffer, SIZE);
};
aux &= 0;
while (target[aux])
buffer[index] = target[aux++], inc();
return *this;
}
inline void close() {
delete this;
}
~writer() {
output_file.write(buffer, index);
output_file.close();
}
private:
static const int SIZE = 0x500000;
int index, aux;
char buffer[SIZE], nr[24];
std::fstream output_file;
};
class mapping_parser {
public:
inline mapping_parser() {
/// default c-tor
}
inline mapping_parser(const char* file_name) {
int fd = open(file_name, O_RDONLY);
block_number &= 0;
index &= 0;
fstat(fd, &sb);
buffer = (char*)mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, fd, 0);
close(fd);
}
template <typename T>
inline mapping_parser& operator >> (T& n) {
n &= 0;
for (; buffer[index] < '0' or buffer[index] > '9'; ++index);
for (; '0' <= buffer[index] and buffer[index] <= '9'; ++index)
n = (n << 3) + (n << 1) + buffer[index] - '0';
return *this;
}
~mapping_parser() {
munmap(buffer, sb.st_size);
}
private:
static const int SIZE = 0x400000; /// 4MB
struct stat sb;
int block_number, index;
char* buffer;
};
mapping_parser f("algsort.in");
writer t("algsort.out");
int n, v[500010];
inline void insertionSort(int low, int up) {
for (int i = low; i < up; ++i) {
int x = v[i];
int j = i;
while ((j > low) and (v[j - 1] > x)) {
v[j] = v[j - 1];
--j;
}
v[j] = x;
}
}
void radixSort(int low, int up, int bits) {
int ptr[1 << BITS], bucket[1 << BITS] = { };
for (int i = low; i < up; ++i)
++bucket[(v[i] >> bits)& MASK];
ptr[0] = low;
bucket[0] += low;
for (int i = 1; i < (1 << BITS); ++i) {
ptr[i] = bucket[i - 1];
bucket[i] += bucket[i - 1];
}
for (int i = 0; i < (1 << BITS); ++i) {
while (ptr[i] != bucket[i]) {
int elem = v[ptr[i]];
int bucket = (elem >> bits)& MASK;
while (bucket != i) {
int tmp = v[ptr[bucket]];
v[ptr[bucket]++] = elem;
elem = tmp;
bucket = (elem >> bits)& MASK;
}
v[ptr[i]++] = elem;
}
}
if (bits) {
for (int i = 0; i < (1 << BITS); ++i) {
int size = bucket[i] - (i ? bucket[i - 1] : low);
if (size > THRESHOLD)
radixSort(bucket[i] - size, bucket[i], bits - BITS);
else if (size > 1)
insertionSort(bucket[i] - size, bucket[i]);
}
}
}
int main()
{
f >> n;
for (int i = 0; i < n; ++i)
f >> v[i];
radixSort(0, n, 24);
for (int i = 0; i < n; ++i)
t << v[i] << " ";
return 0;
}