浅谈冒泡排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈冒泡排序相关的知识,希望对你有一定的参考价值。

#每日美图分享#

浅谈冒泡排序_#include

假设有一个整型数组:arr[]=9,8,7,6,5,4,3,2,1,0;现在需要通过编写程序来把它转换为升序,这时我们就可以考虑用冒泡排序来解决。

先让下标为零的与下标为一的比较大小,如果arr[0]>arr[1],则互相两值交换,此时原先下标为零的数下标变为一,下标为一的数下标变为零;然后下标为一的再和下标为二的进行比较,以此循环···,直到最大的数排在最后。

此时仅仅只是完成了一趟,接着要把第二大的数进行类似上述的操作,使其排在倒数第二位···

···

一直到最小的排在最前的话,需要进行九趟类似操作,其中第一趟需要比较九次,第二趟需要比较八次···,依次递减,直到完成排序。

上述操作可通过两次for循环来实现:

#include<stdio.h>
void bubble_sort(int *n)

int i;
int sz = sizeof(n) / sizeof(n[0]);
for (i = 0; i < 10; i++)

int j;
for(j=0;j<sz-1-i;j++)

if (n[j] > n[j + 1])

int tmp = n[j];
n[j] = n[j + 1];
n[j + 1] = tmp;





int main()

int arr[] = 9,8,7,6,5,4,3,2,1,0 ;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr);
int a = 0;
for (; a < 10; a++)

printf("%d ", arr[a]);


return 0;

浅谈冒泡排序_冒泡排序_02

可以看到这个程序并没有实现升序排序,因为数组在传参的过程中,传过去的只是数组第一个元素的地址,此时其实质就相当于一个指针,则可知

sz=4/4=1(此时电脑为32位),而我们所预期的sz应为10,这也就是出错的主要原因。

当电脑为64位时(sz=8/4=2):

浅谈冒泡排序_冒泡排序_03

改正方法如下,通过把sz=10传过去来避免出错。

#include<stdio.h>
void bubble_sort(int* n,int sz)

int i;
for (i = 0; i < 10; i++)

int j;
for(j=0;j<sz-1-i;j++)

if (n[j] > n[j + 1])

int tmp = n[j];
n[j] = n[j + 1];
n[j + 1] = tmp;




int main()

int arr[] = 9,8,7,6,5,4,3,2,1,0 ;
int sz = sizeof(arr) / sizeof(arr[0]);

bubble_sort(arr, sz);
int a = 0;
for (; a < 10; a++)

printf("%d ", arr[a]);


return 0;

运行结果如下:

浅谈冒泡排序_#include_04

现在可以看到,升序已经基本完成了。

但这个代码其实是还可以优化的,想一下,如果arr[]=0,1,2,3,4,5,6,7,8,9;

的话其实是不用进行排序的,但如果这个数组在我们的代码中的话,还是会呆呆的一个一个进行比较,即使这个数组已经是升序的了。基于上述,我们可以给每一趟比较完后加一个判断:如果数组已经是升序,那就不用在执行循环,直接结束bubble_sort()函数。但该怎么实现呢?

如果是一个升序数组的话,那么arr[j]<arr[j+1],则bubble_sort()函数中第二个for循环中的if()就不会执行,在一趟比较中,如果每次的arr[j]<arr[j+1]

恒成立的话则就说明该数组已经为升序。

则优化方案如下:

#include<stdio.h>
void bubble_sort(int* n,int sz)

int i;
for (i = 0; i < 10; i++)

int j;
int flag = 1; //加了一个flag
for(j=0;j<sz-1-i;j++)

if (n[j] > n[j + 1])

int tmp = n[j];
n[j] = n[j + 1];
n[j + 1] = tmp;
flag = 0;



if (flag == 1) //如果flag==0的话则说明if()执行了,也即说明还未升序
break; /


int main()

int arr[] = 8,9,7,6,5,4,3,2,1,0 ;
int sz = sizeof(arr) / sizeof(arr[0]);

bubble_sort(arr, sz);
int a = 0;
for (; a < 10; a++)

printf("%d ", arr[a]);


return 0;

由于作者水平有限,如有不对欢迎指正。


以上是关于浅谈冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序(升序)

C++ 冒泡排序升序 - 不对所有元素进行排序

浅谈冒泡排序

冒泡排序 & 选择排序(升序)

javascript冒泡排序

冒泡排序法对随机生成的十个数按升序进行排序