Cod sursa(job #1049084)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 6 decembrie 2013 21:08:48
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

void exchg(int&a, int&b){
    int aux = a;a=b;b=aux;
}

int pivot(vector<int>& v, int from, int to) {
    int  pivotPos = from + (rand() % (to-from+1));
    int aux = v[from];
    v[from] = v[pivotPos];
    v[pivotPos] = aux;
    
    pivotPos = from;
    
    for(int i=from+1; i<=to;i++) {
        if(v[i] < v[pivotPos]) {
            exchg(v[pivotPos], v[pivotPos+1]);
            if(i!=pivotPos+1)
                exchg(v[pivotPos], v[i]);
            pivotPos++;
        }
    }
    
    return pivotPos;
}


int pivot2(vector<int>& v, int from, int to) {
    int p = v[from + (rand() % (to-from+1))];
    int i = from;
    int j = to;
    while(true) {
        while(v[j] >= p) j--;
        while(v[i] < p) i++;
        if(i<j)
            exchg(v[i],v[j]);
            else
                return j;
    }
    return 0;
}
void mysort(vector<int>& v, int from, int to) {
    if(from>=to) return;
    int k = pivot2(v, from, to);
    mysort(v, from, k-1);
    mysort(v, k+1, to);
    
}


void kthElement(vector<int>& v,int from, int to, int k) {
    if(from>to)
        return;
    int m = pivot2(v, from, to);
    int dist = m-from;
    if(dist > k) {
        kthElement(v, from, m-1, k);
    }
    if (dist < k) {
        kthElement(v, m+1, to, k-dist-1);
    }
}

int main() {
    int n,k, x;
    ifstream in("algsort.in");
    ofstream out("algsort.out");
    //in>>n>>k;
    in>>n;
    vector<int> v(n);
    for(int i=0;i<n;i++) {
        in>>x;v[i] = x;
    }
    
    mysort(v, 0, v.size()-1);
    for(int i=0;i<v.size();i++) {
        out<<v[i]<<" ";
    }
    //kthElement(v,0,v.size()-1,k-1);
    //out<<v[k-1];
    return 0;
}