排序之冒泡排序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> /*头文件*/ #define M 100 /*定义常量*/ int R[M]; /*定义数组*/ int main() { int i,j,temp,n; printf("input n size:");/*数组大小*/ scanf("%d",&n); printf("input number one by one:\n"); for(i=1;i<=n;i++)/*一个一个的输入数组元素*/ { scanf("%d",&R[i]); } printf("before sort numbers:\n"); for(i=1;i<=n;i++)/*打印排序之前的数组元素*/ { printf("%4d",R[i]); } printf("\n"); for(i=1;i<=n-1;i++)/*排序趟数*/ { for(j=1;j<=n-i;j++)/*每趟比较次数*/ { if(R[j]>R[j+1]) /*判断前一个数据元素是否比后一个大,大于则交换*/ { temp=R[j]; R[j]=R[j+1]; R[j+1]=temp; } } } printf(" after sort numbers:\n"); for(i=1;i<=n;i++) /*打印冒泡排序之后序列*/ { printf("%4d",R[i]); } }
思想:首先是将第1个数和第2个数进行比较,若为逆序(R[1]>R[2]),则交换这两个数的位置,然后比较第2个数和第3数,以此类推,直至第n-1个数和第n个数进行比较为止.这个过程称为第一趟冒泡排序,排序结果是最大的数被排在了最后。即R[n].
接着进行第二趟冒泡排序,即对前n-1个数再次进行两两比较,若为逆序则交换,排序结果是第二大的数被排在倒数第二。即R[n-1].然后进行第三趟冒泡排序,对前n-2个数进行同样的操作,以此类推。
比如:10个数进行冒泡排序,必须进行9趟排序,每一趟中两个数比较次数是不相同的,第一趟比较10-1=9次(10为许排序的数目,1为该趟的趟数),第二趟要比较10-2=8次,以此类推,第i趟要比较的次数=10-i.
如有n个数,则要进行n-1趟排序(由外循环控制),第i趟两数之间的比较要进行n-i次(由内循环控制).
冒泡排序速记口诀(降序):
N个数字来排序,两两相比大靠前,
外层循环N-1,内层循环N-1-i.
如果要升序,
只要把程序中的if (a[j] < a[j + 1])
小于号换成大于号就行了