您的位置:首页 > 理论基础 > 数据结构算法

数据结构——冒泡排序

2018-11-05 20:14 162 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43479736/article/details/83754735

冒泡排序原理

比如要对n个数进行冒泡排序,用两个for循环,外层循环控制循环次数,内层循环从第一个位置开始相邻两个数进行比较,如果前面的数大就交换否则不交换,就这样一直进行比较直到比到最后一个数为止。然后你会发现n个数里最大的数已经被移到最后位置了。比如下面这个数组:

5

12

41

14

21

13

19

7

44

29

经过一次冒泡排序过后:

5

12

41

14

21

13

19

7

 44

29

5

12

41

14

21

13

19

7

44

29

5

12

14

41

21

13

19

7

44

29

5

12

14

21

41

13

19

7

44

29

5

12

14

21

13

41

19

7

44

29

5

12

14

21

13

19

41

7

44

29

5

12

14

21

13

19

7

41 

44

29

5

12

14

21

13

19

7

41

44

29

5

12

14

21

13

 19

7

41

29

44

这样就将最大的数排在了最后面,简单的原理大致就是这样,至于细节我们还是通过代码来观察。

冒泡排序代码

[code]#include <iostream>
using namespace std;
#define SIZE 10

void Swap(int *p1, int *p2);			//交换两个数
void BubbleSort(int arry[], int size);	//冒泡排序

int main()
{
int arry[SIZE] = { 52, 48, 65, 40, 12, 51, 99, 78, 58, 68 };
BubbleSort(arry, SIZE);
for (int i = 0; i < SIZE; i++)
cout << arry[i] << "  ";
cout << endl;
system("pause");
return 0;
}
void Swap(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void BubbleSort(int arry[], int size)
{
for (int i = 0; i < size - 1; i++)		//控制循环次数
{
for (int j = 0; j < size - 1; j++)	//将最大的数移到最后面
{
if (arry[j]>arry[j + 1])
Swap(&arry[j], &arry[j + 1]);
}
}
}

大家看看这个代码是不是还有改进的地方呢?比如到遇到一个本来已经排好序的数组,是不是还是要循环n-1次呢?下面是改进后的代码。

[code]#include <iostream>
using namespace std;
#define SIZE 10

void Swap(int *p1, int *p2);			//交换两个数
void BubbleSort(int arry[], int size);	//冒泡排序

int main()
{
int arry[SIZE] = { 52, 48, 65, 40, 12, 51, 99, 78, 58, 68 };
BubbleSort(arry, SIZE);
for (int i = 0; i < SIZE; i++)
cout << arry[i] << "  ";
cout << endl;
system("pause");
return 0;
}
void Swap(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void BubbleSort(int arry[], int size)
{
for (int i = 0; i < size - 1; i++)		//控制循环次数
{
int flag = 0;
for (int j = 0; j < size - 1; j++)	//将最大的数移到最后面
{
if (arry[j]>arry[j + 1])
{
flag = 1;
Swap(&arry[j], &arry[j + 1]);
}
}
if (flag == 0)//如果flag=0则没有交换 说明整个数组已经排好序就不用再继续循环直接退出
return;
}
}

 

PS:这是博主第一次发表文章,想通过这样的方式来复习一下以前学习的知识并分享给大家,如果有什么做的不好的地方欢迎留言哈,之后一定改进。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: