Pagini recente » Cod sursa (job #524124) | Cod sursa (job #1840130) | Cod sursa (job #1466098) | Istoria paginii runda/spad | Cod sursa (job #1785192)
//sortare cu radix sort
#include <iostream>
#include <fstream>
#include <cmath>
const int MAX = 500000;
class Queue{
private:
int content[MAX];
int first;
int last;
public:
Queue(){
first = 0;
last = -1;
}
bool isEmpty(){
return first > last;
}
void enqueue(int val){
content[++last] = val;
}
int dequeue(){
if(first > last){
std::cout << "Error: dequeue in empty Queue\n";
return -1;
}else{
int ret = content[first];
first++;
return ret;
}
}
};
// cifra lui n pe pozitia pos incepand de la dreapta
int nthDigit(int num, int pos){
return (num / (int)std::pow(10, pos - 1)) % 10;
}
// numarul de cifre al lui n
int nrDigits(int n){
int k = 0;
do{
n /= 10;
k++;
}while(n > 0);
return k;
}
Queue queues[10];
int main(){
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
int n, v[MAX], maxNum = -1, maxLen;
fin >> n;
for(int i = 0; i < n; i++){
fin >> v[i];
if(v[i] > maxNum){
maxNum = v[i];
}
}
maxLen = nrDigits(maxNum);
for(int pos = 1; pos <= maxLen; pos++){
for(int i = 0; i < n; i++){
queues[nthDigit(v[i], pos)].enqueue(v[i]);
}
int l = 0;
for(int i = 0; i <= 9; i++){
while(!queues[i].isEmpty()){
v[l++] = queues[i].dequeue();
}
}
}
for(int i = 0; i < n; i++){
fout << v[i] << " ";
}
fin.close();
fout.close();
return 0;
}