开始学数据结构——(二):冒泡排序

来源:互联网 发布:鸿威软件 编辑:程序博客网 时间:2024/05/21 07:43
/*冒泡排序   : 对于每次遍历,发现前后的大于后面的,则马上交换位置。
            则第一轮可以找到最大的放在最后,然后依次往前面填满。
SQ——2014 04 14
*/

#include<stdio.h>
void swap(int * aa , int * bb);
void bubble(int cc[] ,int n);

int main()
{
  int aa =10;
  int  bb= 5;
    
    printf("aa=%d bb= %d" ,aa,bb);
    swap(&aa ,&bb);
    printf("aa=%d bb= %d" ,aa,bb);
//--------------test _2!--------------------
    
    int cc[10] ={10,8,9,7,6,4,5,3,2,1};
    int i;

    for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)    
        printf("  %d \n" ,cc[i]);
    bubble(cc ,10);
    printf("after bubble!\n");
     for (i =0; i< (sizeof(cc)/sizeof(cc[0])); i++)  
             printf(" %d \n" ,cc[i]);

return 0;
}

void bubble( int a[]  ,int n){

    int i,j,key;
    int  t;
    int flag ;
    for (i=n; i >0; i--) {  //因为冒泡每次都是冒出最大值放在最后,所以应该是每次减少的是最后一个值的位置
        flag =0; //标志一次比较中有没有需要冒泡比较的,要是没有,则不变;
        for(j = 0 ; j < i-1 ;j++) {
            if (a[j] > a[j+1]) {  //如果前面的>后面的。
                flag = 1;              
                swap(&a[j] ,&a[j+1]);
            }
        }
        if( flag == 0) //若不存在交换的情况,则证明已经是排好的了。
            break;
        
    }    
}

void swap(int * aa , int * bb){
    //传递过来的是指针,所以你对指针进行改动是没有意义的。
    int tmp;
    tmp = *aa;
    *aa = *bb;
    *bb = tmp;

}


顺便在最后分析下时间复杂度: 可以看出最外层需要n次遍历,然后内部每次都需要n次交换,则时间复杂度为O(n2);

空间复杂度的话,因为只需要一个空间提供数值交换,则为O(1);

稳定性的话:是稳定的。比如  6 6 4 2 。其实首先放在最后的就是第二个6 ,然后第二个6放在倒数第二位;

0 0
原创粉丝点击