冒泡:
// 最好情况是已经有序,比较 n-1次 0(n)。
// 最坏情况是逆序了,比较n(n-1)/2 交换同等次数, 0(n^2)
// 可做的优化是 { 2 , 1 ,3 ,4 ,5,6,7} 当第一轮循环完以后 已经有序了。
// 优化方式是 设置标志位。 flag = TRUE, 外循环判断 。 内循环里若有交换则还在排序置flag为true,若无交换则循环会停止。
void swap(vector<int> & a , int a1 , int a2 )
{
int temp;
temp = a[a1];
a[a1] = a[a2];
a[a2] = temp ;
}
void buble_sort(vector<int> & v1){
int v_size = v1.size() ;
for( int i=0; i<v_size-1; ++i){
for( int j=v_size-1; j>i ; --j){
if( v1[j]< v1[j-1])
swap(v1,j,j-1) ;
}
}
}
选择排序:
// 无论是否有序,比较次数始终一样,n(n-1)/2 ;
// 最好的时候不用交换,最差的时候 交换次数为 n-1次 。
void swap(vector<int> & a , int a1 , int a2 )
{
int temp;
temp = a[a1];
a[a1] = a[a2];
a[a2] = temp ;
}
void Select_sort(vector<int> & v1){
int v_size = v1.size() , i , j , min ;
for( i=0 ; i<v_size-1; ++i){
min=i ;
for( j=i+1; j<v_size; ++j ){
if( v1[j]<v1[min])
min =j ;
}
if( min!=i )
swap(v1,i,min) ;
}
}
插入排序:
// 直接插入排序 每次设置一个哨兵 v1[0],需要一个记录的辅助空间 ;
// 最好的情况本身有序, 只需比较 n-1次,复杂度o(n) ; 最坏情况逆序 比较 (n+2)(n-1)/2 交换(n+4)(n-1)/2 复杂度 o(n^2);
void Insert_sort(vector<int> &v1){
int i , j ;
for( i=2; i<v1.size(); ++i){
if( v1[i]<v1[i-1] ){
v1[0] = v1[i] ;
for( j=i-1; v1[j]>v1[0]; --j){
v1[j+1] = v1[j] ;
}
}
v1[j+1] = v1[0] ;
}
}