上一篇文章已经说过,桶排序会极大地浪费资源,因此需要用一种更简单的排序方式来完成:冒泡排序。其原理是1.从第一个数字开始,与第二个数进行比较,如果小于第二个数(按从大到小排序),则将其交换数值;2.接着,第二个数与第三个数比较,重复此步骤,直至完成与最后一个数的比较。这样,第一个数就到了它应该呆的地方。但是其他数仍在相对位置没有变动,所以我们仍要重复步骤1,与步骤2.直至所有数字都去到它们该呆的地方,下面是Python代码的实现:
class Solution():
'''
冒泡排序
从大到小排序
'''
def MaoPao(self,x):
#有多少数字,循环多少次
for i in range(len(x)):
#依次读取列表x里面的数据,并与下一个数进行比较
for j in range(len(x)-1):
#如果小于下一个数,就将两个数交换位置
if x[j] < x[j+1]:
x[j], x[j+1] = x[j+1], x[j]
return x
if __name__ == "__main__":
a = Solution()
print(a.MaoPao([1,2,3,4,5,6,7]))
下面附上《啊哈!算法》的C语言实现:
#include <stdio.h>
int main()
{
int a[100],i,j,t,n;
scanf("%d",&n); //输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++) //循环读入n个数到数组a中
scanf("%d",&a[i]);//冒泡排序的核心部分
for(i=1;i<=n-1;i++) //n个数排序,只用进行n-1趟
{
for(j=1;j<=n-i;j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什
么到n-i就可以了。
{
if(a[j]<a[j+1]) //比较大小并交换
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
}
for(i=1;i<=n;i++) //输出结果
printf("%d ",a[i]);
getchar();getchar();
return 0;
}
其实Python完全不用这么麻烦,一个sort函数就可以完成排序,而且冒泡排序极大地浪费了时间。