冒泡排序及优化
先上一段代码
1 for (i=1;i<n;i++) 2 for (j=1;j<=n-i;j++) 3 if (a[j]<a[j+1]) 4 { 5 t=a[j]; 6 a[j]=a[j+1]; 7 a[j+1]=t; 8 }
这是用冒泡排序对一个无序数组从大到小排序
通过n-1轮比较、交换
每一轮从数组最前面的两个开始比较
相邻两个比较
因为最后排完序是从大到小
所以最后排在前面的数一定比排在后面的数大
所以相邻两个比较的时候如果前面的比后面的小
说明它们的相对位置不符合排序后的最终相对位置
就把它们交换
每一轮交换会把一个最小的数移到最后
n-1轮交换之后就排好序了
比如
93 85 77 68 59 100 43 94 75 82
从大到小排
先比较最前面的两个数,即93 和85
发现93>85符合最终顺序
它们的相对位置没问题
然后继续比较85和77
还是没问题
再比77和68
没问题
比到59和100的时候
就有问题了
因为59比100小
所以就交换这两个数
就变成
93 85 77 68 100 59 43 94 75 82
然后继续比
比到43和94
又有问题
就再交换
变成
93 85 77 68 100 59 94 43 75 82
然后比43和75
交换
变成
93 85 77 68 100 59 94 75 43 82
然后比43和82
再交换
变成
93 85 77 68 100 59 94 75 82 43
这样第一轮就比完了
现在数组里面最后一个数是43
这个数是数组里面最小的
排完序后它的位置一定在最后一个
不会再变了
所以接下来就不用管它
下一轮只要给前n-1个排序
93 85 77 68 100 59 94 75 82 43
以此类推
93 85 77 100 68 59 94 75 82 43
93 85 77 100 68 94 59 75 82 43
93 85 77 100 68 94 75 59 82 43
93 85 77 100 68 94 75 82 59 43
第二轮比完之后第二小的会移到n-1的位置
93 85 77 100 68 94 75 82 59 43
然后最后两个数的位置就不会再变了
第三轮只要给前n-2个数排序
93 85 100 77 68 94 75 82 59 43
93 85 100 77 94 68 75 82 59 43
93 85 100 77 94 75 68 82 59 43
93 85 100 77 94 75 82 68 59 43