冒泡,选择,直接插入排序

冒泡:

// 最好情况是已经有序,比较 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] ;
	}
}

猜你喜欢

转载自blog.csdn.net/u013565071/article/details/81280104
今日推荐