C语言 数组 冒泡排序法
以从小到大排序为例,冒泡排序的整体思想是这样的:
从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。
第一轮结束后,继续第二轮。仍然从数组头部开始比较,让较大的元素逐渐往后移动,直到数组的倒数第二个元素为止。经过第二轮的比较,就可以找到次大的元素,并将它放到倒数第二个位置。
以此类推,进行 n-1(n 为数组长度)轮“冒泡”后,就可以将所有的元素都排列好。
下面我们以“3 2 4 1”为例对冒泡排序进行说明。
第一轮 排序过程
3 2 4 1 (最初)
2 3 4 1 (比较3和2,交换)
2 3 4 1 (比较3和4,不交换)
2 3 1 4 (比较4和1,交换)
第一轮结束,最大的数字 4 已经在最后面,因此第二轮排序只需要对前面三个数进行比较。
第一轮要比较三次
第二轮 排序过程
2 3 1 4 (第一轮排序结果)
2 3 1 4 (比较2和3,不交换)
2 1 3 4 (比较3和1,交换)
第二轮结束,次大的数字 3 已经排在倒数第二个位置,所以第三轮只需要比较前两个元素。
第二轮要比较两次
第三轮 排序过程
2 1 3 4 (第二轮排序结果)
1 2 3 4 (比较2和1,交换)
第三轮只要比较一次
至此,排序结束。
所以要比较n-1轮 n代表数组元素的个数
每轮要比较n-1-i i代表第几轮
所以只需要两个for循环即可搞定
例子如下
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int j;
int temp;
int data[10]={8,1,2,5,4,3,7,9,0,6};
for(i=0;i<10-1;i++)
{
for(j=0;j<10-1-i;j++)
{
if(data[j]>data[j+1])
{
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
}
for(i=0; i<10; i++){
printf("%d ", data[i]);
}
printf("\n");
system("pause");
return 0;
}