1.选择排序
public class Main {
public static void main ( String [ ] args) {
int [ ] arr= { 1 , 5 , 3 , 4 , 2 } ;
for ( int i= 0 ; i< 4 ; i++ ) {
int index= i;
for ( int j = i+ 1 ; j < 5 ; j++ ) {
index= arr[ j] > arr[ index] ? index: j;
swap ( arr, i, index) ;
}
}
for ( int x: arr) {
System . out. println ( x) ;
}
}
public static void swap ( int arr[ ] , int a, int b) {
int tmp= arr[ a] ;
arr[ a] = arr[ b] ;
arr[ b] = tmp;
}
}
2.冒泡排序
public class Main {
public static void main ( String [ ] args) {
int [ ] arr= { 1 , 5 , 3 , 4 , 2 } ;
for ( int i = 4 ; i > 0 ; i-- ) {
for ( int j = 0 ; j < i ; j++ ) {
if ( arr[ j] > arr[ j+ 1 ] )
swap ( arr, j, j+ 1 ) ;
}
}
for ( int x: arr) {
System . out. println ( x) ;
}
}
public static void swap ( int arr[ ] , int a, int b) {
if ( arr[ b] == arr[ a] )
return ;
arr[ a] = arr[ a] ^ arr[ b] ;
arr[ b] = arr[ a] ^ arr[ b] ;
arr[ a] = arr[ a] ^ arr[ b] ;
}
}
3.提取一个数最右边的1
int rightOne = eor & ( ~ eor+ 1 ) ;
4.插入排序
public class Main {
public static void main ( String [ ] args) {
int [ ] arr= { 1 , 5 , 9 , 5 , 6 , 4 , 7 , 8 , 5 , 3 } ;
for ( int i = 1 ; i < arr. length ; i++ ) {
for ( int j = i- 1 ; j>= 0 && arr[ j+ 1 ] < arr[ j] ; j-- ) {
swap ( arr, j+ 1 , j) ;
}
}
for ( int x: arr) {
System . out. println ( x) ;
}
}
public static void swap ( int arr[ ] , int a, int b) {
if ( b== a)
return ;
arr[ a] = arr[ a] ^ arr[ b] ;
arr[ b] = arr[ a] ^ arr[ b] ;
arr[ a] = arr[ a] ^ arr[ b] ;
}
}
5.对数器
import java. util. Arrays ;
public class Main {
public static void main ( String [ ] args) {
int testTime= 500000 ;
int maxSize= 100 ;
int maxValue= 100 ;
boolean succed= true ;
for ( int i = 0 ; i < testTime ; i++ ) {
int arr1[ ] = Randomlygeneratednumber ( maxSize, maxValue) ;
int arr2[ ] = copy ( arr1, arr1. length) ;
MethodOne ( arr1) ;
MethodTow ( arr2) ;
if ( ! isEqual ( arr1, arr2) ) {
succed= false ;
break ;
}
}
}
public static int [ ] Randomlygeneratednumber ( int maxSize, int maxValue) {
int arr[ ] = new int [ ( int ) ( ( maxSize+ 1 ) * Math . random ( ) ) ] ;
for ( int i = 0 ; i < arr. length ; i++ ) {
arr[ i] = ( int ) ( ( maxValue+ 1 ) * ( Math . random ( ) ) ) - ( int ) ( ( maxValue) * ( Math . random ( ) ) ) ;
}
return arr;
}
public static int [ ] cope ( int arr[ ] , int length) {
return Arrays . copyOf ( arr, length) ;
}
}
6.提取数组中间数
public class Main {
public static void main ( String [ ] args) {
int arr[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 } ;
int L = 0 ;
int R = arr. length;
int k= L + ( R - L ) >> 1 ;
System . out. println ( k) ;
}
}
7.master公式(递归时间复杂度)
8.归并排序(二分)
public class Main {
public static void main ( String [ ] args) {
int arr[ ] = { 6 , 5 , 6 , 15 , 8 , 63 , 12 , 102 , 4 , 5 , 1 , 0 , 1 , 23 , 2 , 1 , 69 } ;
process ( arr, 0 , arr. length- 1 ) ;
for ( int x: arr)
System . out. println ( x) ;
}
public static void process ( int arr[ ] , int L , int R ) {
if ( L == R ) return ;
int mind = L + ( ( R - L ) >> 1 ) ;
process ( arr, L , mind) ;
process ( arr, mind+ 1 , R ) ;
merge ( arr, L , mind, R ) ;
}
public static void merge ( int arr[ ] , int L , int mind, int R ) {
int [ ] help= new int [ R - L + 1 ] ;
int p1= L ;
int p2= mind+ 1 ;
int i= 0 ;
while ( p1<= mind && p2<= R ) {
help[ i++ ] = arr[ p1] <= arr[ p2] ? arr[ p1++ ] : arr[ p2++ ] ;
}
while ( p1<= mind)
help[ i++ ] = arr[ p1++ ] ;
while ( p2<= R )
help[ i++ ] = arr[ p2++ ] ;
for ( int j = 0 ; j < help. length ; j++ ) {
arr[ L + j] = help[ j] ;
}
}
}
9.快速排序
public class Main {
public static void main ( String [ ] args) {
int arr[ ] = { 6 , 5 , 6 , 15 , 8 , 63 , 12 , 102 , 4 , 5 , 1 , 0 , 1 , 23 , 2 , 1 , 69 } ;
quickSort ( arr, 0 , arr. length- 1 ) ;
for ( int x: arr)
System . out. println ( x) ;
}
public static void quickSort ( int arr[ ] , int L , int R ) {
if ( L < R ) {
swap ( arr, L + ( int ) ( Math . random ( ) * ( R - L + 1 ) ) , R ) ;
int [ ] p= partition ( arr, L , R ) ;
quickSort ( arr, L , p[ 0 ] - 1 ) ;
quickSort ( arr, p[ 1 ] , R ) ;
}
}
public static int [ ] partition ( int arr[ ] , int L , int R ) {
int less= L - 1 ;
int more= R ;
while ( L < more) {
if ( arr[ L ] < arr[ R ] )
swap ( arr, ++ less, L ++ ) ;
} else if ( arr[ L ] > arr[ R ] ) {
swap ( arr, -- more, L ) ;
} else {
L ++ ;
}
}
swap ( arr, more, R ) ;
return new int [ ] {
less+ 1 , more
} ;
}
public static void swap ( int arr[ ] , int a, int b) {
if ( a== b) return ;
arr[ a] ^= arr[ b] ;
arr[ b] ^= arr[ a] ;
arr[ a] ^= arr[ b] ;
}
}