数据结构跑路篇——冒泡排序

来源:互联网 发布:win7照相机软件 编辑:程序博客网 时间:2024/06/06 02:48

1、原理分析:

顾名思义,就是一次循环像冒泡一样,两两比较,最小的浮上来或者最大的沉下去;分析外层控制次数为n次,内层控制剩余比较次数为n-(i+1)次;

图片示意:
这里写图片描述

1.外层为n次
2.内层为剩余循环次数,所以应该从0开始,运行次数为n-(i+1)

2、代码展示:

#include<stdio.h>void bubble(int *arr,int length){    int i,j,tmp;    #外层次数,所以为n次    for(i=0;i<length-1;i++){                #内层剩余次数,所以从0开始,总数为length-i-1        for(j=0;j<length-i-1;j++){            if(arr[j]>arr[j+1]){                tmp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = tmp;            }        }    }   }int main(){    int z;    int arr[]={5,4,8,0,9,100};    int length = sizeof(arr)/sizeof(arr[0]);    bubble(arr,length);    for(z=0;z<length;z++){          printf("%d\n",arr[z]);    }    return 0;}

3.复杂度分析:

  1. 每一次循环需要n-1次;所以总共次数应该是ni=1(i1)次,即n(n-1)/2;所以时间复杂度为O(n2)
  2. 最好的情况为全部正序O(n);最坏的情况为全部逆序O(n2)

4.改进版:

  1. 原因:假设运行时,一次loop,后面的全部正序没有调换顺序,接着第二次loop还要你一个个判断,这样不就浪费了时间吗?
  2. 采取方式:可以设置一个开关,loop时候关闭,如果发生交换则为开启;那么久判断这个开关,如果关闭就没有任何交换,即正序排列,否则继续排序;
  3. 代码实现:
#include<stdio.h>#define True 1#define False 0void bubble(int *arr,int length){    typedef int bool;#定义布尔    int i,j,tmp;    bool flag = True;    for(i=0;i<length-1 && flag;i++){ #优化运行次数        flag = False;        for(j=0;j<length-i-1;j++){            if(arr[j]>arr[j+1]){                tmp       = arr[j];                arr[j]    = arr[j+1];                arr[j+1]  = tmp;                flag = True;            }        }    }   }int main(){    int z;    int arr[]={9,1,8,5,4,3};    int length = sizeof(arr)/sizeof(arr[0]);    bubble(arr,length);    for(z=0;z<length;z++){        printf("%d\n",arr[z]);    }    return 0;}
原创粉丝点击