#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <stdbool.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MaxSize 100
#pragma warning (disable :4996)
typedef struct {
int data[MaxSize];
int length;
}SqList;
int GetElem(SqList L, int i) {
if (i<1 || i>L.length)
{
printf("查找位置不正确\n");
return 0;
}
return L.data[i - 1]; //o(1)
}
int LocateElem(SqList L, int e) {
if (L.length == 0)
{
printf("顺序表为空\n");
return 0;
}
for (int i = 0;i < L.length;i++)
{
if (L.data[i] == e) //时间复杂度分析处: 最好(表头) o(1) 最坏(表尾) o(n)
return i + 1;
} //平均 n+1/2
return 0;
}
int secLocateElem(SqList& L, int& e) { //p19-01
if (L.length == 0)
return -1;
e = L.data[0];
int pos = 0;
for (int i = 0;i < L.length;i++)
{
if (L.data[i] > e)
{
e = L.data[i];
pos = i;
}
}
L.data[pos] = L.data[L.length - 1];
L.length--;
return e;
}
void Listcontracy(SqList& L) { //p19-02
if (L.length == 0)
return;
int* head = &L.data[0];
int* tail = &L.data[L.length - 1];
while (head < tail)
{
int temp;
temp = *head;
*head = *tail;
*tail = temp;
head++;
tail--;
}
return;
}
void selectEmelentDelection(SqList& L, int x) { //p19-03
if (L.length == 0)
return;
int k = 0;
for (int i = 0;i < L.length;i++)
{
if (L.data[i] != x)
{
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return;
}
void deleteformscale(SqList& L, int s, int t)//p19-04
{
if (s < t)
{
printf("不正确\n");
return;
}
if (L.length == 0)
return;
int k = 0;
for (int i = 0;i < L.length;i++)
{
if (!(L.data[i] >= s && L.data[i] <=t))
{
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return;
}
void deleterepeatE(SqList& L)//p19-05
{
if (L.length == 0)
return;
int k = 0;
int i = 0;
for (k = 1;k < L.length;k++) {
if (L.data[k] == L.data[i]) continue;//找到重复的不做动作,而是将正常的向前移把重复挤掉
L.data[++i] = L.data[k];
}
L.length = i+1;
}
void twolist_to_one(SqList& m, SqList& n,SqList& result)//p19-06
{
if (m.length == 0 || n.length == 0||m.length+n.length>MaxSize)
return ;
int i = 0, j = 0;int temp = 0;
for (i,j;i < m.length&&j<n.length;)
{
if (m.data[i] <= n.data[j])
result.data[temp++] = m.data[i++];
else result.data[temp++] = n.data[j++];
}
while(i<m.length)
result.data[temp++] = m.data[i++];
while(j<n.length)
result.data[temp++] = n.data[j++];
result.length = temp;
}
void reverse(int a[], int left, int right, int arraySize)//逆转函数,前后对调,p19-07
{
if (left >= right || right >= arraySize)
return;
int mid = (left + right) / 2;
for (int i = 0;i < mid - i;i++)
{
int temp = a[left + i];
a[left + i] = a[right - i];
a[right - i] = temp;
}
}
void exchange_array(int a[], int m, int n, int arraySize)//p19-07
{
reverse(a, 0, m + n - 1, arraySize);
reverse(a, 0, n - 1, arraySize);
reverse(a, n, m + n - 1, arraySize);
}
void search_and_insert(SqList& l, int x)//p19-08
{
int pos = 0;
for (int i = 0;i < l.length;i++)
{
if (l.data[i] < x) continue;
if (l.data[i] >= x)
{
if (l.data[i]==x)
{ int temp = l.data[i];
l.data[i] = l.data[i + 1];
l.data[i + 1] = temp;
break;
}
if (l.data[i] > x)
{
int temp =i;
while (i < l.length)
{
l.data[i+1] = l.data[i];
l.data[i] = x;
i++;
}
l.length++;
break;
}
}
}
}
void samekey(int a[],int b[],int c[], int n)//p19-09
{
int i = 0, j = 0,k = 0;
while (i <n && j<n &&k <n)
{
if (a[i] == b[j] && b[j] == c[k])
{
printf("%d", a[i]);
i++;
j++;
k++;
}
else {
int maxnum = max(a[i], max(b[i], c[i]));
if (a[i] < maxnum)i++;
if (b[j] < maxnum)j++;
if (c[k] < maxnum)k++;
}
//时间为o(n),空间为o(1)
}
}
void reverse2(int R[], int h, int e)//p19-10
{
int i, temp;
for (i = 0;i < (h + e) / 2;i++)
{
temp = R[h + i];
R[h + i] = R[e - i];
R[e - i] = temp;
}
}
void cycleleftshift(int* R, int n, int p)//p19-10
{//ab到ba ab->a^-1* b -> a^-1* b^-1 -> ba
reverse2(R, 0, p - 1);
reverse2(R, p, n - 1);
reverse2(R, 0, n - 1);
}
int M_search(int A[], int B[], int n) {
int s1 = 0, d1 = n - 1, s2 = 0, d2 = n - 1, m1, m2; //起点 终点 中间点
while (s1 != d1 || s2 != d2) {
m1 = (s1 + d2) / 2;
m2 = (s2 + d2) / 2;
if (A[m1] == B[m2]) return A[m1]; //若相等
if (A[m1] < B[m2]) { //若a<b
if ((s1 + d1) % 2 == 0) { //若长度是奇数
s1 = m1; //删除a前边的并保留a
d1 = m2; //删除b后边的并保留b
}
else { //若长度是偶数
s1 = m1 + 1; //删除a以及a前边的
d2 = m2; //删除b后边的并保留b
}
}
else { //a>b 与上边同理 互换操作即可
if ((s2 + d2) % 2 == 0) {
d1 = m1;
s2 = m2;
}
else {
d1 = m1;
s2 = m2 + 1;
}
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
}
//p19-11
int find_centerElement(int a[], int n)//p19-12 时间o(n) 空间o(n)
{
int* b = new int[n]();
for (int i = 0;i < n;i++)
{
b[a[i]]++;
if (b[a[i]] > (n / 2))
{
printf("%d", a[i]);
return a[i];
}
}
return -1;
}
int findmid_positiveint(int a[], int n)//p19-13
{
int* b = new int[n+1]();
for (int i = 0;i < n;i++)
{ if(a[i]>=0)
b[a[i]]++;
}
for (int i = 1;i < n+1;i++)
{
if (b[i] == 0)
return i;
}
}
int Minimum_distance_of_triples(int a[],int b[],int c[],int n1,int n2,int n3)//p19-14
{
int min_val = INT_MAX;
int p1, p2, p3;
p1 = p2 = p3 = 0;
while (p1 != n1 && p2 != n2 && p3 != n3) {
if (a[p1] <= min(b[p2], c[p3])) {
min_val = min(min_val, 2 * (max(b[p2], c[p3]) - a[p1]));
p1++;
}
else if (b[p2] <= min(a[p1],c[p3])) {
min_val = min(min_val, 2 * (max( a[p1], c[p3]) -b[p2]));
p2++;
}
else if ( c[p3]<= min(b[p2],a[p1] )) {
min_val = min(min_val, 2 * (max(b[p2],a[p1] ) -c[p3] ));
p3++;
}
}
return min_val;
}
void ListInsert(SqList& L, int i, int e) {
if (i<1 || i>L.length + 1)
{
printf("插入位置不正确\n");
return;
}
if (L.length >= MaxSize)
{
printf("顺序表已满,无法插入\n");
return;
}
for (int j = L.length;j >= i;j--)//时间复杂度分析处: 最好(插到表尾) i=n+1; o(1) 最坏(表头) i=1 o(n)
L.data[j] = L.data[j - 1];//平均 (0+1+2+...+n) *1/(n+1) =n/2
L.data[i - 1] = e;
L.length++;
}
bool ListDelete(SqList& L, int i, int& e) {
if (i<1 || i>L.length)
{
printf("删除位置不正确\n");
return false;
}
e = L.data[i - 1];
for (int j = i;j <= L.length;j++)//时间复杂度分析处: 最好(删表尾) i=n; o(1) 最坏(表头) i=1 o(n)
L.data[j - 1] = L.data[j];//平均 (0+1+2+...+n-1) *1/n = n-1/2
L.length--;
return true;
}
void InitList(SqList& L) {
L.length = 0;
for (int i = 0;i < MaxSize;i++)
L.data[i] = 0;
}
int main() {
SqList L,Q,result;
InitList(L);
InitList(Q);
InitList(result);
int R[5] = { 1,2,3,4,5 };
int A[8] = { 0,5,5,3,5,1,5,7 };
int B[4] = { -5,3,2,3 };
int C[3] = { 1,2,3 };
int s1[] = { -1,0,9 };
int s2[] = { -25,-10,10,11 };
int s3[] = { 2,9,17,30,41 };
//int e;
ListInsert(L, 1, 1);
ListInsert(L, 2, 2);
ListInsert(L, 3, 3);
ListInsert(L, 4, 4);
ListInsert(Q, 1, 3);
ListInsert(Q, 2, 4);
ListInsert(Q, 3, 5);
ListInsert(Q, 4, 7);
cout << Minimum_distance_of_triples(s1, s2, s3, 3, 4, 5);
// int resultsum = find_centerElement(A, 8);
//int resultsum2 = findmid_positiveint(B, 4);
//int resultsum3 = findmid_positiveint(C, 3);
//printf("%d\n", resultsum2);
//printf("%d", resultsum3);
//for (int i = 0;i < L.length;i++)
//{
// printf("%d", L.data[i]);
//
//}
//printf("\n");
//for (int i = 0;i < Q.length;i++)
//{
// printf("%d", Q.data[i]);
//}
//printf("\n");
deleterepeatE(L);
twolist_to_one(L, Q, result);
//search_and_insert(L, 3);
//for (int i = 0;i < L.length;i++)
//{
// printf("%d", L.data[i]);
//}
//printf("\n");
//search_and_insert(Q, 6);
//for (int i = 0;i < Q.length;i++)
//{
// printf("%d", Q.data[i]);
//}
/* for (int i = 0;i < 5;i++)
printf("%d", R[i]);
printf("\n");
cycleleftshift(R, 5, 2);
for (int i = 0;i < 5;i++)
printf("%d", R[i]);
printf("\n");*/
/*for (int i = 0;i < result.length;i++)
{
printf("%d", result.data[i]);
}*/
return 0;
}
书上示例前面没试,后面试了,在注释处可以调试。