黑马程序员技术交流社区

标题: 冒泡排序的详细解读 [打印本页]

作者: 一步步往上爬    时间: 2016-1-10 01:35
标题: 冒泡排序的详细解读
冒泡排序:
简单来说就是把一个数组中的元素,按照从小到大(从大到小)的顺序进行重新排列,使数组的元素从第一个到最后一个的值都是越来越大(越来越小)的

比如说有一个数组
int nums[] = {5,543,23,12,1};

经过冒泡排序后
那么数组中的每个元素变成了
1 5 12 23 543


实现思路:就是两个元素两两比较,小的放后面,大的放前面


比如说有个数组:元素设置为


下标:0  1  2  3  4
--------------------------------
5  4  3  2  1

4  5  3  2  1


一共比较4次
第一轮:4  5  3  2  1    0跟0+1比较后的结果
4  3  5  2  1   1跟1+1比较后的结果
4  3  2  5  1   2跟2+1比较后的结果
4  3  2  1  5   3跟3+1比较后的结果

一共比较3次
第二轮:3  4  2  1  5
3  2  4  1  5
3  2  1  4  5
一共比较2次
第三轮:2  3  1  4  5
2  1  3  4  5

一共比较1次
第四轮:1  2  3  4  5


外面一个大的循环用来控制轮数(到底循环多少轮?)
长度-1轮

每轮里面又有一个循环控制一共比较的次数 (每轮里面又比较多少次呢?)
长度 - 轮数(轮数从1开始的)

如果轮数从0开始, 长度 - (轮数+1)

长度 - 轮数 - 1

for(int i=0;i<5-1;i++){//外层循环控制轮数,但是这个轮数从0开始

for(int j=0;j<5-i-1;j++){//比较次数

if( nums[j] > nums[j+1] ){ //判断当前的元素是否比下一个元素大

//交换这两个元素
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}

}


例子:
#include <stdio.h>

int main(int argc, const char * argv[]) {
    int arr[] = {25,12,36,4,6,5,8,456,565,4255,45,54};
    int length = sizeof(arr)/sizeof(int);
    for (int i = 0; i < length - 1; i++) {
        for (int j = 0; j < length -i - 1; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    for (int i = 0; i < length; i++) {
        printf("%d\n",arr[i]);
    }
    for (int i = length -1; i >= 0; i--) {
        printf("%d\n",arr[i]);
    }
    return 0;
}

作者: hnsfxyzl    时间: 2016-1-10 14:23
很详细                                                            
作者: 明阳天夏    时间: 2016-1-10 17:59
总结得很详细。
作者: 哓哓大梦想    时间: 2016-1-10 22:51
赞一个!!
作者: ak13211    时间: 2016-1-10 23:17
不做伸手党
作者: fengfeng520    时间: 2016-1-10 23:38
今天刚学的冒泡排序  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2