基础算法
快速排序算法模板
public void quickSort ( int [ ] nums, int start, int end) {
if ( start >= end) return ;
int l = start;
int r = end;
int mid = l + ( r- l>> 1 ) ;
int pivot = nums[ mid] ;
while ( l <= r) {
while ( l <= r && nums[ l] < pivot) {
l++ ;
}
while ( l <= r && nums[ r] > pivot) {
r-- ;
}
if ( l <= r) {
int temp = nums[ l] ;
nums[ l] = nums[ r] ;
nums[ r] = temp;
l++ ;
r-- ;
}
}
quickSort ( nums, start, r) ;
quickSort ( nums, l, end) ;
}
归并排序算法模板
public void mergeSort ( int [ ] arr, int start, int end) {
if ( start >= end) return ;
int [ ] temp = new int [ start- end] ;
int mid = start + ( end- start>> 1 ) ;
int l = start;
int r = mid+ 1 ;
int index = start;
mergeSort ( arr, l, mid, temp) ;
mergeSort ( arr, r, end, temp) ;
while ( l <= mid && r<= end) {
if ( arr[ l] <= arr[ r] ) {
temp[ index++ ] = arr[ l++ ] ;
} else {
temp[ index++ ] = arr[ r++ ] ;
}
}
while ( l<= mid) {
temp[ index++ ] = arr[ l++ ] ;
}
while ( r<= end) {
temp[ index++ ] = arr[ r++ ] ;
}
for ( int i = start; i <= end; i++ ) {
arr[ i] = temp[ i] ;
}
}
整数二分算法模板
二分搜索总结
bool check ( int x) {
}
int bsearch_1 ( int l, int r)
{
while ( l < r)
{
int mid = l + r >> 1 ;
if ( check ( mid) ) r = mid;
else l = mid + 1 ;
}
return l;
}
int bsearch_2 ( int l, int r)
{
while ( l < r)
{
int mid = l + r + 1 >> 1 ;
if ( check ( mid) ) l = mid;
else r = mid - 1 ;
}
return l;
}
一维前缀和
S[ i] = a[ 1 ] + a[ 2 ] + . . . a[ i]
a[ l] + . . . + a[ r] = S[ r] - S[ l - 1 ]
二维前缀和
S[ i, j] = 第i行j列格子左上部分所有元素的和
以( x1, y1) 为左上角,( x2, y2) 为右下角的子矩阵的和为:
S[ x2, y2] - S[ x1 - 1 , y2] - S[ x2, y1 - 1 ] + S[ x1 - 1 , y1 - 1 ]
一维差分
S[ i] = a[ 1 ] + a[ 2 ] + . . . a