顺序表Sqlist
#include <iostream>
using namespace std;
#define maxsize 100
typedef struct
{
int data[maxsize];
int length;
} Sqlist;
int Find(Sqlist L, int x)
{
int i = 0;
for (; i < L.length; ++i)
{
if (x < L.data[i])
break;
}
return i;
}
void Insert(Sqlist &L, int x)
{
int j, p;
p = find(L, x);
for (j = L.length - 1; j >= p; --j)
L.data[j + 1] = L.data[j];
L.data[p] = x;
(L.length)++;
}
int Del_Min(Sqlist &L)
{
int min = L.data[0];
int pos = 0;
for (int i = 0; i < L.length; ++i)
if (L.data[i] < min)
{
min = L.data[i];
pos = i;
}
L.data[pos] = L.data[L.length - 1];
L.length--;
return min;
}
void Swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
void Reverse(Sqlist &L)
{
int i = 0;
int j = L.length-1;
for (;i <= L.length / 2; i++,j--)
{
swap(L.data[i],L.data[j]);
}
}
void change(int A[],int m,int n)
{
int mid = (m + n) / 2;
for (int i = m, int j = n; i <= mid / 2; i++ ,j--)
{
Swap(A[i],A[n]);
}
}
void Del1(Sqlist &L,int x)
{
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;
}
void Del2(Sqlist &L, int x)
{
int k = 0;
for (int i = 0; i < L.length; ++i)
{
if (L.data[i] == x)
k++;
else
L.data[i - k] = L.data[i];
}
L.length = L.length - k;
}
void Del1(Sqlist &L,int s,int t)
{
if (L.length == 0 || s >= t)
return false;
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;
}
bool del(Sqlist &L)
{
int i, j;
for (i = 0, j = 1; j < L.length; ++j)
if (L.data[i] != L.data[j])
L.data[++i] = L.data[j];
L.length = i + 1;
return true;
}
bool merge(Sqlist A, Sqlist B, Sqlist &C)
{
int i = 0, j = 0, k = 0;
while (i < A.length && j < B.length)
{
if (A.data[i] < B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
}
while (i < A.length)
C.data[k++] = A.data[i++];
while (j < B.length)
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
*/09.求两个递增序列合并后的中位数(两种方法) 用法一 法二不写了图一乐。同08*/
int Find(Sqlist &A, Sqlist &B)
{
int i, j, k;
i = j = k = 0;
Sqlist C;
while (i < A.length && j < B.length)
if (A.data[i] < B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
while (i < A.length)
C.data[k++] = A.data[i++];
while (j < B.length)
C.data[k++] = B.data[j++];
return C.data[(A.length + B.length - 1) / 2];
}
*/10.设计一个时间上尽可能高效的算法,找出数组中未出现的最小正整数
思想 通过另一个等长的数组,通过B的数组下标 记录保存A[i]是否出现*/
int find(int A[], int n)
{
int i;
int *B = new int[n];
for (int k = 0; k < n; ++k)
B[k] = 0;
for (i = 0; i < n; ++i)
if (A[i] > 0 && A[i] <= n)
B[A[i] - 1] = 1;
for (i = 0; i < n; ++i)
if (B[i] == 0)
break;
delete[] B;
return i + 1;
}
int find(int A[], int n)
{
int i;
int *B = new int[n];
for (int k = 0; k < n; ++k)
B[k] = 0;
for (i = 0; i < n; ++i)
if (A[i] > 0 && A[i] <= n)
B[A[i] - 1]++;
for (i = 0; i < n; ++i)
if (B[i] > n / 2)
(
delete[] B;
return i + 1;
)
return -1;
}