Cod sursa(job #1170389)

Utilizator mihai995mihai995 mihai995 Data 13 aprilie 2014 14:51:47
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int N = 1 + 5e5, gap[] = {8, 1, 4, 10, 23, 57, 132, 301, 701};

int v[N];

void qsort(int st, int dr){
    if (dr <= st)
        return;

    swap( v[dr], v[st + rand() % (dr - st + 1)] );
    int poz = st;
    for (int i = st ; i < dr ; i++)
        if ( v[i] < v[dr] || (v[i] == v[dr] && (rand() & 1) ) ){
            swap(v[i], v[poz]);
            poz++;
        }
    swap(v[poz], v[dr]);

    qsort(st, poz - 1);
    qsort(poz + 1, dr);
}

void bubbleSort(int st, int dr, int gap){
    bool flag = true;
    while (flag){
        flag = false;
        for (int i = st + gap ; i <= dr ; i++)
            if ( v[i] < v[i - gap] ){
                swap(v[i], v[i - gap]);
                flag = true;
            }
    }
}

void shellSort(int st, int dr){
    bool flag;
    for (int k = gap[0] ; k ; k--)
        for (int i = 0 ; i < gap[k] ; i++)
            bubbleSort(st + i, dr, gap[k]);
}

int main(){
    ifstream in("algsort.in");
    for (int i = 0 ; i <= v[0] ; i++)
        in >> v[i];
    in.close();

    shellSort(1, v[0]);

    ofstream out("algsort.out");
    for (int i = 1 ; i <= v[0] ; i++)
        out << v[i] << ' ';
    out << '\n';
    out.close();

    return 0;
}