#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;
}
}