1.算法思想(参考:https://www.cnblogs.com/nicaicai/p/12549959.html)
通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。
2.冒泡排序的C语言实现
(1)排序的总趟数和每趟排序数组元素的比较次数都设置为数组大小n-1,排序的比较次数为(n-1)*(n-1)次
//冒泡排序 #include <stdio.h> int main() { //定义一个整型数组 int a[]={9,8,3,5,2,10,7}; int i,j,n; //整个数组的大小除以第一个数组元素的大小 ,得到数组的长度 n=sizeof(a)/sizeof(a[0]); //排序前的数组 printf("排序前:"); for(i=0;i<n;i++) { printf("a[%d]=%d ",i,a[i]); } for(i=0;i<n-1;i++) //排序的总趟数,等于数组大小-1 { for(j=0;j<n-1;j++) //每一趟数组元素的比较次数 { /*如果前一个数组元素比之后一个数组元素大,则交换它们的位置*/ if(a[j]>a[j+1]) { int temp; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf(" "); //排序后的数组 printf("排序后:"); for(i=0;i<n;i++) { printf("a[%d]=%d ",i,a[i]); } return 0; }
运行结果:
(2)改进的冒泡排序算法,每趟排序的总比较次数依次减1,已经排序好的数组元素不再参与每趟排序的比较,最坏的情况下比较次数为n-1+n-2.........+1=n*(n-1)/2次。
//冒泡排序 #include <stdio.h> int main() { //定义一个整型数组 int a[]={9,8,3,5,2}; int i,j; //排序前的数组 printf("排序前:"); for(i=0;i<5;i++) { printf("a[%d]=%d ",i,a[i]); } for(i=0;i<5-1;i++) //排序的总趟数,等于数组大小-1 { for(j=0;j<5-1-i;j++) //每一趟数组元素的比较次数 { if(a[j]>a[j+1]) { int temp; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf(" "); //排序后的数组 printf("排序后:"); for(i=0;i<5;i++) { printf("a[%d]=%d ",i,a[i]); } return 0; }
运行结果:
参考文章:
http://c.biancheng.net/view/6506.html
https://www.cnblogs.com/nicaicai/p/12549959.html