八大排序(二)冒泡排序
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
遍历
在介绍冒泡排序之前我先引入一个概念,以方便解释。
遍历,字面意思是遍历就是全部走遍,到处周游的意思。当然遍历的概念也适合于多元素集合的情况,如数组。
(程序代码上的意思是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,访问结点所做的操作依赖于
具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。)【()中的内容这些以后会学到】
主要思路
冒泡排序每次遍历整个数列 ,先找出最大的一项放到数列的最后一项(与最后一项的数交换),
再找出第二大的一项放到倒数第二项,以此类推, 直到整个数列排序完
我们可以先假设有一个n项的数列, 先遍历n项, 找到最大的一项放到第n个位置(与第n个位置的数交换),
再遍历n-1项(因为最后一项已经是最大的,没必要再遍历),以此类推,直到整个数列排完。
此过程只需要n-1次, 剩下的一定是最小的数, 放到第一项即可。
下图是一个n = 7的冒泡排序
首先找到了89(最大一项),和55(最后一项)交换,其次找到了61, 和55(倒数第二项)交换……直到结束
代码实现
函数
在这里我要引入一个叫函数的概念
- 我们在做程序开发的时候,为了便于多个人开发,或者是的代码的思路更清晰,喜欢将独立的功能模块独立出来,写成函数。
比如我要冒泡排序,写个函数就可以了。 - BubbleSore(int a[],int n) { 排序算法实现; } 所有项目中的地方都可以调用这个函数,代码只要写一遍就可以了。
- 既然排序的是数组,所以直接是对待排序的那个数组在操作。不需要返回值,数组就改变了, 所以直接命名成void型。
代码
#include<stdio.h>
int arr[100000];//定义一个非常大的数组, 防止溢出
//Bubblesort是冒泡排序的英文,len是length的缩写,相当于n,
//()内是参数列表【就是你要输入函数体内的量】,注意要输入一个数组时要在int后+*
void BubbleSort(int *arr,int len)
{
int temp, i, j;
for(i = 0; i < len - 1; i++)//意味着执行n - 1次
for(j = 0; j < len - 1 - i; j++)//len-1-i不遍历那些已经按顺序放到末尾的数, 因为i次意味着排好i个数了
{
if(arr[j] > arr[j+1])//如果左边大于右边就将两个数的位置调换
{
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
int main()
{
int i, n;
scanf("%d",&n);
for(i = 0; i < n; i++)//输入一个数列
{
scanf("%d", &arr[i]);
}
BubbleSort(arr, n+1);//调用冒泡排序函数进行排序
for(i = 0; i < n; i++)//输出排好序的数列
{
printf("%d ",arr[i]);
}
return 0;
}