顺序表

#include <iostream>
#include <time.h>
#include <stdlib.h>

const int max_size = 50;
using namespace std;
typedef struct{
    int value[max_size];
    int length = 0;
}Sqlist;

void init(Sqlist &S, int n);
void review(Sqlist &S);
void print(Sqlist S);
void Swap(int &a, int &b);
void msort(int nums[], int n);
int Partition_Hoare(int a[], int left, int right);
int Binary_search(int nums[],int n, int value, int opp);
bool part2_01(Sqlist &S);
bool part2_02(Sqlist &S);
bool part2_03(Sqlist &S, int value);
bool part2_04(Sqlist &S, int s, int t);
bool part2_05(Sqlist &S, int s, int t);
bool part2_06(Sqlist &S);
Sqlist* part2_07(Sqlist &S1, Sqlist &S2);
// part2_8() 同 part2_10 2010
// partw_9() 二分 同part2_04
bool part2_10(Sqlist &S, int pos);  //2010 真 O(n) O(1)
int part2_11(Sqlist &S1, Sqlist &S2);
int part2_12(Sqlist &S); //快排 O(nlog2n) 最优解  O(n)
int part2_13(Sqlist &S); // 桶 O(n) O(n)
// part2_14 归并   O(n) O(n)
// srand((unsigned)time(NULL));

Sqlist S;
int main()
{
    init(S, 11);
    print(S);
    return 0;
}

void init(Sqlist &S, int n)
{
    srand((unsigned)time(NULL));
    for(int i=0;i<n;++i){
        S.value[i] = rand();
    }
    S.length = n;
}


void review(Sqlist &S)
{
    for(int i=S.length;i<S.length + 5;++i){
        S.value[i] = S.value[i - 8];
    }

    S.length += 5;
}

void print(Sqlist S)
{
    for(int i=0;i<S.length;++i){
        cout << S.value[i] << "  ";
    }
    cout << "\n";
}

void Swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

void msort(int nums[], int n)
{
    for(int i=n-1;i>=0;--i){
        for(int j=0;j<i;++j){
            if(nums[j] > nums[j+1]){
                Swap(nums[j], nums[j+1]);
            }
        }
    }
}


int Partition_Hoare(int a[], int left, int right){
    int i = left;
    int j = right;
    int key = a[left];

    while(i != j){
        while(i < j && a[j] >= key)      	 //向左找到小于基准值的值的下标
            j--;
        while(i < j && a[i] <= key)      	 //向右找到大于基准值的值的下标
            i++;
    swap(a[i], a[j]);
    }
    /*   i等于j时跳出循环 当前基准值此时在下标为i的位置(合适的位置)   */
    swap(a[left], a[i]);	                 //最左边的元素变为处于当前合适位置的元素,把基准值放在合适位置
    return i;                                  //返回合适位置(i,j都可以)
}


int Binary_search(int nums[], int n, int value, int opp)
{
    int l = 0, r = n-1, mid = (l + r) >> 1;
    while(1){
        if(nums[mid] == value)
            return mid;
        else if(nums[mid] > value){
            //cout << "l: " << l << " r: " << r << " mid: " << nums[mid] << " value: " << value << "\n";
            r = mid;
            mid = (l + r) >> 1;
        }
        else if(nums[mid] < value){
            //cout << "l: " << l << " r: " << r << " mid: " << nums[mid] << " value: " << value << "\n";
            l = mid + 1;
            mid = (l + r) >> 1;
        }

        if(l >= r) break;
    }

    if(opp == 0) return l-1;

    else return l;
}

bool part2_01(Sqlist &S)
{
    if(S.length == 0) {
        cout << "S is NULL, Error.\n" ;
        return false;
    }
    int nmin = S.value[0], pos = 0;
    for (int i=0;i<S.length;++i) {
        if(nmin > S.value[i]){
            nmin = S.value[i];
            pos = i;
        }
    }

    for(int i=pos;i<S.length;++i){
        if(i + 1 >= S.length)
            break;
        S.value[i] = S.value[i + 1];
    }

    S.length --;
    return true;
}

bool part2_02(Sqlist &S)
{
    if(S.length == 0){
        cout << "S is NULL, Error.\n" ;
        return false;
    }

    for(int i=0, j = S.length-1;i<j;++i, --j){
        Swap(S.value[i], S.value[j]);
    }
    return true;
}

bool part2_03(Sqlist &S, int value)
{
    int cnt = 0;
    for(int i=0;i<S.length;++i){
        if(S.value[i] == value){
            cnt ++;
        }
        else{
            S.value[i-cnt] = S.value[i];
        }
    }
    S.length -= cnt;
}

bool part2_04(Sqlist &S, int s, int t)
{
    if(s >= t || S.length == 0)
        return false;
    int l = Binary_search(S.value, S.length, s, 1);
    int r = Binary_search(S.value, S.length, t, 0);
    //cout << "l: " << l << " r: " << r << "\n";
    int cnt = r - l + 1;
    for(int i=l;i<l+cnt;i++){
        S.value[i] = S.value[i+cnt];
    }
    S.length -= cnt;
    return true;
}

bool part2_05(Sqlist &S, int s, int t)
{
    int cnt = 0;
    for(int i=0;i<S.length;++i){
        if(S.value[i] >= s && S.value[i] <= t){
            cnt ++;
        }
        else{
            S.value[i-cnt] = S.value[i];
        }
    }
    S.length -= cnt;
}

bool part2_06(Sqlist &S)
{
    int nums[max_size];
    int cnt = 0, last = S.value[0] + 1, l = 0;
    while(1){
        if(S.value[l] != last){
            cout << S.value[l] << "  ";
            nums[cnt++] = S.value[l];
            last = S.value[l];
        }
        l++;
        if(l >= S.length)
            break;
    }
    cout << "\n";
    for(int i=0;i<cnt;++i){
        S.value[i] = nums[i];
    }

    S.length = cnt;
    return true;
}

Sqlist* part2_07(Sqlist &S1, Sqlist &S2)
{
    int l = 0, r = 0,cnt = 0;
    Sqlist* res = (Sqlist*)malloc(sizeof(Sqlist));
    while(1){
        if(S1.value[l] <= S2.value[r]){
            //cout << S1.value[l] << " " << S2.value[r] << "\n";
            res->value[cnt++] = S1.value[l];
            l ++;
        }else{
            //cout << S1.value[l] << " " << S2.value[r] << "\n";
            res->value[cnt++] = S2.value[r];
            r ++;
        }
        if(l >= S1.length || r >= S2.length)
            break;
    }

    while(1) {
        if(l  >= S1.length)
            break;
        res->value[cnt++] = S1.value[l];
        l ++;

    }
    while(1) {
        if(r  >= S2.length)
            break;
        res->value[cnt++] = S2.value[r];
        r ++;
    }
    res->length = S1.length + S2.length;
    return res;
}

bool part2_10(Sqlist &S, int pos)
{
    int lastpos = pos, lastvalue = S.value[pos];
    int cnt = 0;
    if(S.length == 0 || pos < 0 || pos >= S.length)
        return false;
    while(1){
        int index = lastpos - pos;
        if(index < 0) index = S.length + index;
        int temp = S.value[index];
        S.value[index] = lastvalue;
        lastvalue = temp;
        lastpos = index;
        cnt ++;
        if(cnt == S.length)
            break;
    }
}

int part2_11(Sqlist &S1, Sqlist &S2)
{
    int mid = (S1.length + S2.length) >> 1;
    int l = 0, r = 0, cnt = 0, opp = -1;
    while(1){
        if(S1.value[l] <= S2.value[r]){
            cnt++;
            opp = 0;
            //
            l ++;
        }
        else{
            cnt++;
            opp = 1;
            //
            r ++;
        }
        if(cnt == mid)
            return opp==0?S1.value[l-1]:S2.value[r];

        if(l >= S1.length || r >= S2.length){
            break;
        }
    }
    while(1){
        if(l >= S1.length)
            break;
        cnt++;
        l++;
        opp = 0;
        if(cnt == mid)
            break;
    }
    while(1){
        if(r >= S2.length)
            break;
        cnt++;
        r++;
        opp = 1;
        if(cnt == mid)
            break;
    }
    return opp==0?S1.value[l-1]:S2.value[r];
}

int part2_12(Sqlist &S)
{
    if(S.length == 0)
        return -1;
    int last = S.value[0], cnt = 1;
    for(int i=1;i<S.length;++i){
        if(S.value[i] == last)
            cnt++;
        else{
            if(cnt > 0)
                cnt--;
            else{
                last = S.value[i];
                cnt = 1;
            }
        }
    }
    if(cnt <= 0) return -1;
    cnt = 0;
    for(int i=0;i<S.length;++i){
        if(last == S.value[i])
            cnt++;
    }
    if(cnt > S.length/2) return last;
    else return -1;

}

int part2_13(Sqlist &S)
{
    int nmax = 0;
    for(int i=0;i<S.length;++i){
        if(S.value[i] > nmax)
            nmax = S.value[i];
    }
    const int msize = nmax + 1;
    int nums[msize];
    for(int i=0;i<msize;i++)
        nums[i] = 0;
    for(int i=0;i<S.length;++i){
        if(S.value[i] > 0)
            nums[S.value[i]] = 1;
    }

    for(int i=1;i<msize;++i){
        if(nums[i] == 0)
            return i;
    }

}
posted @ 2023-04-11 22:53  小麟qwq  阅读(4)  评论(0)    收藏  举报