删除大小范围x-y之间的元素
# include <bits/stdc++.h>
using namespace std;
# define Max 50
struct SqList
{
int a[ Max] = { 4 , 1 , 2 , 5 , 0 , 0 , 3 } ;
int length = 7 ;
} ;
bool listdelete ( SqList & L, int s, int v)
{
if ( s>= v|| L. length == 0 ) return false ;
bool flag = false ;
for ( int i = 0 ; i < L. length ; i++ )
{
if ( L. a[ i] >= s)
{
flag = true ;
break ;
}
}
if ( ! flag) return false ;
int k= 0 ;
for ( int i = 0 ; i < L. length; i++ )
{
if ( L. a[ i] >= s&& L. a[ i] <= v) k++ ;
else L. a[ i- k] = L. a[ i] ;
}
L. length = L. length - k;
}
int main ( )
{
SqList L;
if ( listdelete ( L, 3 , 5 ) )
{
for ( int i = 0 ; i < L. length; i++ )
{
cout<< L. a[ i] << " " ;
}
cout<< endl;
} else cout<< "错误" << endl;
return 0 ;
}
有序顺序表中删除重复元素
# include <bits/stdc++.h>
using namespace std;
# define Max 50
struct SqList
{
int a[ Max] = { 2 , 2 , 3 , 3 , 3 , 5 , 6 , 6 , 7 } ;
int length = 9 ;
} ;
void listdelete ( SqList & L)
{
int black = 0 ;
for ( int red = 0 ; red < L. length; red++ )
{
if ( L. a[ red] != L. a[ red- 1 ] )
{
L. a[ black] = L. a[ red] ;
black++ ;
}
}
L. length = black;
}
int main ( )
{
SqList L;
listdelete ( L) ;
for ( int i = 0 ; i < L. length; i++ )
{
cout<< L. a[ i] << " " ;
}
cout<< endl;
return 0 ;
}
合并两个有序表 找合并后的中位数
# include <bits/stdc++.h>
using namespace std;
# define Max 50
struct SqList {
int data[ Max] ;
int length;
} ;
bool verge ( SqList a, SqList b, SqList & c)
{
if ( c. length < a. length + b. length) return false ;
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 = a. length + b. length;
return true ;
}
int findd ( SqList c)
{
int m = 0 ;
if ( c. length % 2 == 0 ) m = ( c. data[ ( 0 + c. length- 1 ) / 2 ] + c. data[ c. length/ 2 ] ) / 2 ;
else m = c. data[ c. length/ 2 ] ;
return m;
}
int main ( )
{
SqList a = { { 2 , 4 , 6 , 8 , 20 } , 5 } ;
SqList b = { { 11 , 13 , 15 , 17 , 19 } , 5 } ;
SqList c;
if ( ! verge ( a, b, c) )
{
cout<< "合并错误" << endl;
} else
{
for ( int i = 0 ; i < c. length; i++ )
{
cout<< c. data[ i] << " " ;
}
cout<< endl;
}
cout<< findd ( c) << endl;
return 0 ;
}
逆置顺序表 或者 循环左移p
# include <bits/stdc++.h>
using namespace std;
# define Max 50
struct SqList {
int a[ Max] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ;
int length = 7 ;
} ;
void reserve ( SqList & L, int left, int right)
{
for ( int i = left; i < ( left + right) / 2 ; i++ )
{
int t = L. a[ i] ;
L. a[ i] = L. a[ left+ right- i] ;
L. a[ left+ right- i] = t;
}
}
void prin ( SqList & L)
{
for ( int i = 0 ; i < L. length; i++ )
{
cout<< L. a[ i] << " " ;
} cout<< endl;
}
void change ( SqList & L, int m, int n)
{
cout<< "整个逆置" << endl;
reserve ( L, 0 , n+ m- 1 ) ;
prin ( L) ;
cout<< "前n个逆置" << endl;
reserve ( L, 0 , n- 1 ) ;
prin ( L) ;
cout<< "后m个逆置" << endl;
reserve ( L, n, n+ m- 1 ) ;
prin ( L) ;
}
int main ( )
{
SqList L;
change ( L, 3 , 4 ) ;
return 0 ;
}
折半查找
# include <bits/stdc++.h>
using namespace std;
# define Max 50
struct SqList {
int a[ Max] = { 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 } ;
int length = 8 ;
} ;
void findd ( SqList & L, int x)
{
int left, right, mid;
left = 0 , right = L. length- 1 ;
while ( left<= right)
{
mid = ( left+ right) / 2 ;
if ( L. a[ mid] == x) break ;
else if ( L. a[ mid] > x) right= mid- 1 ;
else left = mid+ 1 ;
}
if ( L. a[ mid] == x&& mid!= L. length- 1 )
{
int t = L. a[ mid] ;
L. a[ mid] = L. a[ mid+ 1 ] ;
L. a[ mid+ 1 ] = t;
}
if ( right < left)
{
int i;
for ( i = L. length- 1 ; i> right; i-- )
{
L. a[ i+ 1 ] = L. a[ i] ;
}
L. a[ i+ 1 ] = x;
L. length= L. length+ 1 ;
}
}
int main ( )
{
SqList L;
findd ( L, 7 ) ;
cout<< L. length<< endl;
for ( int i = 0 ; i< L. length; i++ )
{
cout<< L. a[ i] << " " ;
} cout<< endl;
return 0 ;
}
主元素
# include <bits/stdc++.h>
using namespace std;
int a[ 8 ] = { 0 , 5 , 5 , 3 , 5 , 1 , 5 , 7 } ;
int n = 8 ;
bool half ( int a[ ] , int & cc)
{
int c = a[ 0 ] ;
int count = 1 ;
for ( int i = 1 ; i < n; i++ )
{
if ( a[ i] == c) count++ ;
else
{
if ( count > 0 ) count-- ;
else {
c = a[ i] ;
count = 1 ;
}
}
}
int k = 0 ;
for ( int i = 0 ; i < n; i++ )
{
if ( a[ i] == c) k++ ;
}
if ( k > n/ 2 )
{
cc = c;
return true ;
} else return false ;
}
int main ( )
{
int cc;
if ( ! half ( a, cc) ) cout<< "false" << endl;
else cout<< cc<< endl;
return 0 ;
}
数组中未出现的最小正整数
# include <bits/stdc++.h>
using namespace std;
int a[ 4 ] = { - 5 , 3 , 2 , 3 } ;
int n = 4 ;
int findd ( int a[ ] )
{
int b[ n+ 2 ] = { 0 } ;
for ( int i = 0 ; i < n; i++ )
{
if ( a[ i] > 0 && a[ i] <= n- 1 )
{
b[ a[ i] ] = 1 ;
}
}
int ans = 0 ;
for ( int i = 1 ; i < n+ 2 ; i++ )
{
if ( b[ i] == 0 )
{
ans = i;
break ;
}
}
return ans;
}
int main ( )
{
cout<< findd ( a) << endl;
return 0 ;
}
三元组最小距离
# include <bits/stdc++.h>
using namespace std;
# define Max 0x7ffffff
int a[ 3 ] = { - 1 , 0 , 9 } ;
int b[ 4 ] = { - 25 , - 10 , 10 , 11 } ;
int c[ 5 ] = { 2 , 9 , 17 , 30 , 41 } ;
bool minn ( int a, int b, int c)
{
if ( min ( a, min ( b, c) ) == a) return true ;
else return false ;
}
int findd ( int a[ ] , int b[ ] , int c[ ] , int na, int nb, int nc)
{
int i = 0 , j = 0 , k = 0 , ans = Max;
while ( i < na&& j < nb&& k < nc&& ans >= 0 )
{
int v = abs ( a[ i] - b[ j] ) + abs ( b[ j] - c[ k] ) + abs ( c[ k] - a[ i] ) ;
if ( v< ans) ans = v;
if ( minn ( a[ i] , b[ j] , c[ k] ) ) i++ ;
else if ( minn ( b[ j] , a[ i] , c[ k] ) ) j++ ;
else k++ ;
}
return ans;
}
int main ( )
{
cout<< findd ( a, b, c, 3 , 4 , 5 ) << endl;
return 0 ;
}