冒泡排序
例如我要对一个数组中的5个数进行排序:
定义数组a[5]={5,4,3,2,1}
首先将数组中的第一个数和第二个数比较,将最大的数放到第二个,然后将第二个数和第三个数比较,将最大的数放到第三个,然后将第三个数和第四个数进行比较,将最大的数放到第四个,将第四个数与第五个数进行比较,将最大的数放到第五个数。
然后你就会发现第五个数(也就是a[4])是这五个数的最大值。
将最大的数找出来后,然后对前四个数进行类似上面的两两比较,都会将最大的数放到最后一个,这样依次类推,你就会发现每次都会有最大的数沉到下面,也就是所谓的冒泡排序。
用代码实现,前五个数比较将最大数的放到最后一个a[4]上
代码:
int a[5]={5,4,3,2,1};
//循环次数为4次
/*
5和4,4和3,3和2,2和1 加起来总共4次
*/
for(int i=0;i<4;i++){
//a[i]和a[i+1]两个数进行交换
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
for(int i=0;i<5;i++){
printf("%2d",a[i]);
}
结果:
4 3 2 1 5
Process returned 0 (0x0) execution time : 0.102 s
Press any key to continue.
然后再将前四个数的最大值放到这四个数的最后一个a[3]上
代码:
int a[5]={5,4,3,2,1};
//循环4次
for(int i=0;i<4;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环3次
for(int i=0;i<3;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
for(int i=0;i<5;i++){
printf("%2d",a[i]);
}
结果:
3 2 1 4 5
Process returned 0 (0x0) execution time : 0.061 s
Press any key to continue.
然后再将前三个数的最大值放到这三个数的最后一个a[2]上
代码:
int a[5]={5,4,3,2,1};
//循环4次
for(int i=0;i<4;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环三次
for(int i=0;i<3;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环两次
for(int i=0;i<2;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
for(int i=0;i<5;i++){
printf("%2d",a[i]);
}
2 1 3 4 5
Process returned 0 (0x0) execution time : 0.017 s
Press any key to continue.
然后再将前两个数的最大值放到这两个数的最后一个a[1]上
代码:
int a[5]={5,4,3,2,1};
//循环四次
for(int i=0;i<4;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环三次
for(int i=0;i<3;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环两次
for(int i=0;i<2;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
//循环一次
for(int i=0;i<1;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
for(int i=0;i<5;i++){
printf("%2d",a[i]);
}
1 2 3 4 5
Process returned 0 (0x0) execution time : 0.079 s
Press any key to continue.
注意:上面的四个for循环中除了for循环条件,其余都是一样的,也就是说第一个for循环循环4次,第二个for循环共循环三次,第三个for循环共循环两次,第四个for循环共循环一次,
这样我们就可以再次嵌套一个for循环,这个for循环的次数为4,因为代码中总共有4个for循环。
int a[5]={5,4,3,2,1};
for(int k=0;k<4;k++){
for(int i=0;i<4-k;i++){
if(a[i]>a[i+1]){
int num=a[i];
a[i]=a[i+1];
a[i+1]=num;
}
}
}
for(int i=0;i<5;i++){
printf("%2d",a[i]);
}
结果:
1 2 3 4 5
Process returned 0 (0x0) execution time : 0.017 s
Press any key to continue.
代码中用到了4-k,随着每次K++,这样就会形成4,3,2,1次数。
总结:如果是n个数比较大小,外面一层for循环条件就是k=0;k<n-1;k++
里面一层for循环条件就是i=0;i<n-1-k;i++