#include "vec.h"

Vec::Vec(int len, int mode)
{
    _used = len - 1;
    _len = len * 2;
    _v = new int[_len];

    // for (int i = 0; i <= _used; i++)
    //     _v[i] = i + 1;
    if (mode == 1)
    {
        for (int i = 0; i <= _used; i++)
            _v[i] = rand() % (2 * (_used + 1));

        for (int i = 0; i <= _used; i++)
            swap(i, rand() % (2 * (_used + 1)));
    }
    else if (mode == 2)
    {
        for (int i = 0; i <= _used; i++)
            _v[i] = _used - i;
        for (int i = 0; i <= _used; i++)
            swap(i, rand() % ((_used + 1)));
    }
}

int Vec::get(int a)
{
    return _v[a];
}

void Vec::put(int a, int value)
{
    _v[a] = value;
}

void Vec::swap(int a, int b)
{
    int temp = _v[a];
    _v[a] = _v[b];
    _v[b] = temp;
}

void Vec::expand()
{
    _len = _len * 2;
    int *p = new int[_len];

    for (int i = 0; i <= _used; i++)
        p[i] = _v[i];

    delete[] _v;
    _v = p;
}

void Vec::shrink()
{
    if (((double)_used / (double)_len) >= 0.25)
        return;

    _len = _len >> 1;
    int *p = new int[_len];

    for (int i = 0; i <= _used; i++)
        p[i] = _v[i];

    delete[] _v;
    _v = p;
}
//位置 数值
int Vec::insert(int locate, int value)
{
    if (locate == _used + 1)
    {
        _used++;
        _v[_used] = value;
        return 0;
    }
    if (locate < 0 || locate > _used)
        return -1;

    _used++;

    if (_used >= _len)
        expand();

    for (int i = _used; i > locate; i--)
        _v[i] = _v[i - 1];

    _v[locate] = value;

    return 0;
}

//位置 删除个数
int Vec::remove(int locate, int value)
{

    if (locate < 0 || ((_used - value) < 0) || ((locate + value - 1) > _used))
        return -1;

    _used = _used - value;

    for (int i = locate; i <= _used; i++)
        _v[i] = _v[i + value];

    shrink();

    return value;
}

//删除某一元素
int Vec::remove_sorted(int value)
{
    int j, i;

    for (i = 0; i <= _used && _v[i] != value; i++)
        ;

    for (j = 1; _v[i + j] == value; j++)
        ;

    return remove(i, j);
}

int Vec::count(int value)
{
    int j, i;

    for (i = 0; i <= _used && _v[i] != value; i++)
        ;

    for (j = 0; _v[i + j] == value && i + j <= _used; j++)
        ;

    if (j == 0)
        return -1;

    return j;
}

int Vec::find(int value)
{
    int i = 0;
    for (i; i <= _used; i++)
    {
        if (_v[i] == value)
        {
            return i;
        }
    }

    return -1;
}

int Vec::getlen()
{
    return _len;
}

int Vec::getused()
{
    return _used;
}

void Vec::printall()
{
    for (int i = 0; i <= _used; i++)
        printf("%d\n", _v[i]);
}

void Vec::bubbleSort()
{
    int n = _used;
    bool sorted = false;

    while (!sorted)
    {
        sorted = true;

        for (int i = 1; i <= n; i++)
        {
            if (_v[i - 1] > _v[i])
            {
                swap(i - 1, i);

                sorted = false;
            }
        }
        n--;
    }
    _sorted = true;
}

void Vec::mergeSort(int lo, int hi)
{
    if (lo >= hi)
    {
        return;
    }
    int mi = lo + (hi - lo) / 2;
    mergeSort(lo, mi);
    mergeSort(mi + 1, hi);
    merge(lo, mi, hi);

    _sorted = true;
}
int Vec::search(int e)
{
    if (_sorted == false)
        return -1;

    int i = 0;
    for (i; i <= _used && _v[i] <= e; i++)
        ;

    return i - 1;
}

void Vec::merge(int lo, int mi, int hi)
{

    int i = lo, j = mi + 1, k = 0;
    int *temp = new int[hi - lo + 1];
    while (i <= mi && j <= hi)
    {
        if (_v[i] <= _v[j])
            temp[k++] = _v[i++];
        else
            temp[k++] = _v[j++];
    }
    while (i <= mi)
        temp[k++] = _v[i++];
    while (j <= hi)
        temp[k++] = _v[j++];
    for (i = lo, k = 0; i <= hi; i++, k++)
        _v[i] = temp[k];
    delete[] temp;
}

void Vec::reorder()
{
    for (int i = 0; i <= _used; i++)
            swap(i, rand() % ((_used + 1)));
}