先来介绍一下冒泡排序:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序顾名思义就是将一些没有顺序的数字排的有顺序:
int main() { int a=0; //定义一个接受值 int b[20]={0}; //定义数组,这就是我们后面要用到的排序数组 printf("你要输入多少个值:"); scanf("%d",&a); for(int d=0;d<a;d++) { printf("输入第%d个数:",d+1); scanf("%d",&b[d]); } s_mpqx(b,a); return 0; }
我们搞定了数组的内容后现在就可以传值和传址,进行排序:
void s_mpqx(int* b[],int a) //数组是传址,统计数是传值 { int i,j; int ret=0; for(i=0;i<a-1;i++) { for(j=0;j<a-i-1;j++) { if(b[j]>b[j+1]) { ret=b[j]; b[j]=b[j+1]; b[j+1]=ret; } } } }
这里需要强调一下,10个数字只需要比9次就可以了,所以要减一(a-1)
而比完一次就少一次,所以在比9次的基础上(a-1-i)
当然排序结束,还需要看是否已经排序成功了,完整的代码:
#include <stdio.h> void s_mpqx(int* b[],int a) //数组是传址,统计数是传值 { int i,j; int ret=0; for(i=0;i<a-1;i++) { for(j=0;j<a-i-1;j++) { if(b[j]>b[j+1]) { ret=b[j]; b[j]=b[j+1]; b[j+1]=ret; } } } } int main() { int a=0; //定义一个接受值 int b[20]={0}; //定义数组,这就是我们后面要用到的排序数组 printf("你要输入多少个值:"); scanf("%d",&a); for(int d=0;d<a;d++) { printf("输入第%d个数:",d+1); scanf("%d",&b[d]); } s_mpqx(b,a); for(int z=0;z<a;z++) { printf("%d ",b[z]); } return 0; }
优化版:
在上面排序的过程中,不难发现有很多的步骤是重复的,既浪费时间又无效,这个时候可以让计算机提前去判断是否符号条件,如果符合条件了再进行排序,既省时间又高效:
void s_mpqx(int* b[], int a) //数组是传址,统计数是传值 { int i, j; int ret = 0; int pd=1; for (i = 0; i < a - 1; i++) { pd=1; for (j = 0; j < a - i - 1; j++) { pd=1; if (b[j] > b[j + 1]) { ret = b[j]; b[j] = b[j + 1]; b[j + 1] = ret; pd=0; } } if(pd==1) { break; } } }
我们首先需要让数值进行一次比较,在所有数字都是按照正确的顺序时,pd的值不变,在外层for循环中直接退出即可,省去了多次去比较而浪费时间
这样我们的冒泡排序和优化后的就诞生了,有问题的可以私聊!