标签:style blog http color io 数据 for 2014
1.冒泡法原理
原理很简单每一趟排序将最大的或者最小的数往后移动,知道一趟排序过程中没有数据交换为止。
例如:一个序列有n个数据a1,a2……an,第一趟排序为:首先a1和a2比较,如何逆序则交换位置,然后a2,a3比较,以此类推an-1和an比较。然后进入第二趟排序排序的范围为a1~an-1...第3 ,第4.……直到一趟排序过程中没有发生数据交换则停止。
2.冒泡法代码
main.cpp
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define INIT 10000 5 #define INCRENMENT 100 6 7 8 //顺序列表结构体 9 typedef struct List{ 10 int *elem;//基地址 11 int length;//顺序列表的长度 12 int size;//总长度 13 }List; 14 //列表初始化 15 void init(List &L) 16 { 17 L.elem=(int*)malloc(sizeof(int)*INIT); 18 L.length=0; 19 L.size=INIT; 20 printf("初始化成功\n"); 21 } 22 //显示列表数据 23 void print(List L) 24 { 25 for(int i=1;i<=L.length;i++) 26 printf("%d\t",L.elem[i]); 27 printf("\n"); 28 29 } 30 //插入新数据 31 void insert(List &L,int i) 32 { 33 if(L.length>=L.size) 34 { 35 L.elem=(int*)realloc(L.elem,sizeof(int)*(L.size+INCRENMENT)); 36 if(!L.elem) 37 { 38 printf("内存分配不足\n"); 39 exit(-1); 40 41 } 42 L.size+=INCRENMENT; 43 } 44 L.elem[++L.length]=i; 45 //printf("%d插入完毕\n",i); 46 47 } 48 void BubbleSort(List &L,int &compareCount,int &changeCount) 49 { 50 bool change; 51 int c=0;//比较次数 52 int d=0;//交换次数 53 for(int i=L.length,change=true;change && i>0;i--) 54 { 55 change=false; 56 for(int j=1;j<i;j++) 57 { 58 c++; 59 if(L.elem[j]>L.elem[j+1]) 60 { 61 int temp=L.elem[j]; 62 L.elem[j]=L.elem[j+1]; 63 L.elem[j+1]=temp; 64 change=true; 65 d++; 66 } 67 68 } 69 compareCount=c; 70 changeCount=d; 71 } 72 } 73 int main() 74 { 75 List L; 76 init(L); 77 for(int i=1;i<=10;i++){ 78 insert(L,i*239%99); 79 } 80 printf("初始化10个随机数据\n"); 81 print(L); 82 printf("排序完后数据\n"); 83 int c,d; 84 BubbleSort(L,c,d); 85 printf("比较次数=%d,交换次数=%d\n",c,d); 86 print(L); 87 return 0; 88 }
3.运行结果
4.冒泡法效率分析
如果初始序列为“正序”的话,需要比较n-1次;如果初始序列为“逆序”的话,则需要比较n(n-1)/2次,然后交换移动相应的次数,因此冒泡排序的算法的时间复杂度为O(N^2)
最差情况O(n^2),最好情况O(n)
标签:style blog http color io 数据 for 2014
原文地址:http://www.cnblogs.com/forsta/p/3881164.html