赞
踩
以从小到大排序为例,冒泡排序的整体思想是这样的:
从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。
第一轮结束后,继续第二轮。仍然从数组头部开始比较,让较大的元素逐渐往后移动,直到数组的倒数第二个元素为止。经过第二轮的比较,就可以找到次大的元素,并将它放到倒数第二个位置。
以此类推,进行 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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。