Pagini recente » Cod sursa (job #1046649) | Borderou de evaluare (job #1058846) | Cod sursa (job #3000445) | Cod sursa (job #2069750) | Cod sursa (job #2674712)
// bucket sort
#include <stdio.h>
#include <vector>
using namespace std;
void swap(int& a, int& b) {
int aux = a;
a = b;
b = aux;
}
inline bool isDigit(char c) {
return c >= '0' && c <= '9';
}
// citire numar natural
int readInt(FILE* fin) {
char ch;
int res = 0;
// eliminam caracterele de dinaintea numarului (spatiu, rand nou, orice caracter care nu este cifra)
while (!isDigit(ch = fgetc(fin)));
// adaugam cifrele la numar pana cand caracterul citit nu mai este cifra
do {
res = 10 * res + ch - '0';
} while (isDigit(ch = fgetc(fin)));
return res;
}
#define MAX_N 500000
#define NO_VALUES (1 << 31)
#define NO_BUCKETS (1 << 10)
#define VALUES_PER_BUCKET (1 << 21)
int v[MAX_N];
vector<int> bucket[NO_BUCKETS];
inline int getBucketNumber(int value) {
return value / VALUES_PER_BUCKET;
}
void sort(int bucketIndex) {
vector<int>& v = bucket[bucketIndex];
int i, j;
for (i = v.size() - 1; i > 0; --i)
for (j = i - 1; j >= 0; --j)
if (v[i] < v[j])
swap(v[i], v[j]);
}
int main() {
FILE* fin = fopen("algsort.in", "r");
int n, i, j, k;
fscanf(fin, "%d", &n);
for (i = 0; i < n; ++i)
v[i] = readInt(fin);
fclose(fin);
for (i = 0; i < n; ++i)
bucket[getBucketNumber(v[i])].push_back(v[i]);
k = 0;
for (i = 0; i < NO_BUCKETS; ++i) {
sort(i);
for (j = 0; j < bucket[i].size(); ++j)
v[k++] = bucket[i][j];
}
FILE* fout = fopen("algsort.out", "w");
for (i = 0; i < n; ++i)
fprintf(fout, "%d ", v[i]);
fclose(fout);
return 0;
}