冒泡法排序

概念

  对线性表的进行来回扫描,将最大者沉到表底,最小者像气泡一样冒到表头,冒泡法由此得名,此外还有下沉排序的称呼

基本流程

  从表头开始往后扫描线性表,扫描时逐次比较相邻两个元素的大小,若前面的元素大于后面的元素,则将它们互换,直到将最大的元素换到表尾

  从后往前扫描剩下的线性表,扫描时逐次比较相邻两个元素的大小,若后面的元素小于前面的元素,则将它们互换,直到将最小的元素换到表头

  对于剩余的线性表重复上述过程,直到剩余线性表为空,此时认为线性表变为有序

运算量

  假设线性表的长度为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 }

 

运行结果

 

 

posted @ 2020-04-13 13:41  曲杨  阅读(321)  评论(0)    收藏  举报