冒泡法排序
概念
对线性表的进行来回扫描,将最大者沉到表底,最小者像气泡一样冒到表头,冒泡法由此得名,此外还有下沉排序的称呼
基本流程
从表头开始往后扫描线性表,扫描时逐次比较相邻两个元素的大小,若前面的元素大于后面的元素,则将它们互换,直到将最大的元素换到表尾
从后往前扫描剩下的线性表,扫描时逐次比较相邻两个元素的大小,若后面的元素小于前面的元素,则将它们互换,直到将最小的元素换到表头
对于剩余的线性表重复上述过程,直到剩余线性表为空,此时认为线性表变为有序
运算量
假设线性表的长度为n
最坏的情况下,需要经过n/2遍的从前往后的扫描和n/2遍的从后往前扫描,需要比较n(n-1)/2次
示意图
C++实现
1 /** 2 ****************************************************************************** 3 * @file : bubble_sort.c 4 * @brief : 冒泡法排序函数及其使用范例 5 ****************************************************************************** 6 * @attention 7 * 8 * 本程序参考了《计算机软件技术基础》3.3.1例程 9 * 冒泡法排序算法本体为void bubble_sort(T *p,int size) 10 * 使用测试及范例在void main()中 11 * 12 ****************************************************************************** 13 */ 14 15 #include<iostream> 16 #include<iomanip> 17 18 using namespace std; 19 20 /** 21 * @brief 冒泡法排序函数 22 * @param p: 指向待排序数据的指针 23 * @param size: 待排序数据的个数 24 * @retval 无 25 */ 26 template<class T> 27 void bubble_sort(T *p,int size) 28 { 29 T *start,*end,*i; 30 T temp; //负责交换元素时的临时存放 31 start=p; //数据初始地址 32 end=p+size-1; //数据结束地址 33 while (start < end) 34 { 35 for(i=start;i<end;i++) //从后往前扫描 36 { 37 if(*(i)>*(i+1)) //相邻两个数据中大的那个向后移 38 { 39 temp=*(i); 40 *(i)=*(i+1); 41 *(i+1)=temp; 42 } 43 } 44 for(i=end;i>start;i--) //从前往后扫描 45 { 46 if(*(i-1)>*(i)) //相邻两个数据中小的那个向前移 47 { 48 temp=*(i); 49 *(i)=*(i-1); 50 *(i-1)=temp; 51 } 52 } 53 start=start+1; //重新定向,使其指向未排序数据的开头 54 end=end-1; //重新定向,使其指向未排序数据的开头 55 } 56 } 57 58 void main() 59 { 60 int i,j,k; 61 double p[50]; 62 for(i=0,j=0;i<50;i++,j++) //载入待排序序列 63 { 64 p[i]=j; 65 if(j==9)j=-1; 66 } 67 cout<<"排序前的序列"<<endl; 68 for(i=0,k=0;i<10;i++) 69 { 70 for(j=0;j<5;j++) 71 { 72 cout<<p[k]<<" "; 73 k=k+1; 74 } 75 cout<<endl; 76 } 77 cout<<endl; 78 bubble_sort(p,50); 79 cout<<"排序后的序列"<<endl; 80 for(i=0,k=0;i<10;i++) 81 { 82 for(j=0;j<5;j++) 83 { 84 cout<<p[k]<<" "; 85 k=k+1; 86 } 87 cout<<endl; 88 } 89 cout<<endl; 90 }
运行结果



浙公网安备 33010602011771号