排序
O(n2):选择排序、插入排序 、冒泡排序
选择排序:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。 直接插入排序 :将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。 冒泡排序:两个数比较大小,较大的数下沉,较小的数冒起来。
void selection_sort ( int arr[ ] , int len) {
for ( int i= 0 ; i< len; i++ ) {
int min= i;
for ( int j= i+ 1 ; j< len; j++ ) {
if ( arr[ j] < arr[ min] ) {
min= j;
}
}
swap ( arr[ min] , arr[ i] ) ;
}
}
void bubble_sort ( int arr[ ] , int len) {
for ( int i= 0 ; i< len- 1 ; i++ )
for ( int j= 0 ; j< len- 1 - i; j++ )
if ( arr[ j] > arr[ j+ 1 ] )
swap ( arr[ j] , arr[ j+ 1 ] ) ;
}
void insertion_sort ( int arr[ ] , int len) {
for ( int i= 1 ; i< len; i++ ) {
int key= arr[ i] ;
int j= i- 1 ;
while ( j>= 0 && key< arr[ j] ) {
arr[ j+ 1 ] = arr[ j] ;
j-- ;
}
arr[ j+ 1 ] = key;
}
}
O(nlog n):归并排序、快速排序
归并排序:把待排序的序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序的序列。 快速排序 :从数列中挑出一个元素,称为 “基准”(pivot);然后重新排序数列,所有比基准值小的元素放置在基准前面,所有比基准值大的元素放置在基准的后面,和基准相同的元素则可以放置在任何一边。在这个分区结束之后,该基准就处于序列中的某一位置。这一操作称为分区(partition)操作。然后,递归地把小于基准值元素的子序列和大于基准值元素的子序列进行排序
void Merge ( int r[ ] , int temp[ ] , int s, int m, int t) {
int i= s;
int j= m+ 1 ;
int k= i;
while ( i<= m&& j<= t) {
if ( r[ i] <= r[ j] )
temp[ k++ ] = r[ i++ ] ;
else
temp[ k++ ] = r[ j++ ] ;
}
while ( i<= m)
temp[ k++ ] = r[ i++ ] ;
while ( j<= t)
temp[ k++ ] = r[ j++ ] ;
for ( i= s; i<= t; i++ )
r[ i] = temp[ i] ;
}
void MergeSort ( int r[ ] , int temp[ ] , int s, int t) {
if ( s== t)
return ;
else {
int m= ( s+ t) / 2 ;
MergeSort ( r, temp, s, m) ;
MergeSort ( r, temp, m+ 1 , t) ;
Merge ( r, temp, s, m, t) ;
}
}
int Paritition ( int A[ ] , int low, int high) {
int pivot= A[ low] ;
while ( low< high) {
while ( low< high&& A[ high] >= pivot)
-- high;
A[ low] = A[ high] ;
while ( low< high&& A[ low] <= pivot)
++ low;
A[ high] = A[ low] ;
}
A[ low] = pivot;
return low;
}
void QUickSort ( int A[ ] , int low, int high) {
if ( low< high) {
int pivot= Paritition ( A, low, high) ;
QuickSort ( A, low, pivot- 1 ) ;
QucikSort ( A, pivot+ 1 , high) ;
}
}