冒泡排序
来源:互联网 发布:java 模拟post请求 编辑:程序博客网 时间:2024/06/06 16:11
1.算法描述
冒泡算法和选择排序一样,也属于蛮力算法。简单描述为:在一个长度为n的数列中,相邻的数字之间两两比较,如果两个数字的大小排序不符合排序要求(降序或升序),则交换这两个数字的位置,依次比较,直到最后两个数字之间比较结束,这样最大的数字放到了列表的最后的位置,然后再从[0,n-2]个数中进行比较,第二大数字最后放到数列的倒数第二个位置...重复这样的操作n-1次,排序完成。简单记忆为:两两比较,越比越少,重复n-1次。
2.实例
使用冒泡排序将下列数列按升序排列
5 2 9 1 4 3
第一次排序
5和2不符合升序排列,互换后数列如下:
2 5 9 1 4 3
5和9符合升序排序,位置不变,9和1不符合升序排序,位置互换,互换后数列如下:
2 5 1 9 4 3
9和4不符合升序排序,位置互换,互换后数列如下:
2 5 1 4 9 3
9和3的位置不符合升序排序,位置互换,互换后数列如下:
2 5 1 4 3 9
第一次排序结束,最大数9放到了最终位置。
第二次排序
2和5符合升序排列,位置不变,5和1不符合升序排列,位置互换,互换后数列如下:
2 1 5 4 3 9
5和4不符合升序排列,位置互换,互换后数列如下:
2 1 4 5 3 9
5和3不符合升序排列,位置互换,互换后数列如下:
2 1 4 3 5 9
第二次排序结束,第二大数5放到了最终位置。
第三次排序
2和1不符合升序排序,互换位置,互换后数列如下:
1 2 4 3 5 9
2和4符合升序排列,位置不变,4和3不符合升序排列,位置互换,互换后数列如下:
1 2 3 4 5 9
4和5符合升序排列,位置不变,第三次排序结束,第三大数4放到了最终位置。
第四次排序
数列中所有的数两两比较,都符合升序排序,没有需要互换位置的。
1 2 3 4 5 9
第四次排序结束,第四大数3放到了最终位置。(本排序中3在第三次排序中就已经放到了最终位置)
第五次排序
数列中所有的数两两比较,都符合升序排序,没有需要互换位置的。
1 2 3 4 5 9
第五次排序结束,第五大数2放到了最终位置,前5个数位置已经排好,那么第六个数1的位置也就确定了,因此排序终于结束了。
在上面的实例中我们发现,排序在第三次循环中就已经排好了,但是还是需要继续循环,直到第5次(n-1)排序才结束,这样多做了两次没有意义的循环,因此该算法还有可以优化的地方,在下面的代码中会贴出普通的冒泡排序和优化后的冒泡排序代码。
3.代码
void bubble_sort::bubble_sort_with_array(int nums[], int num_count){//we need loop n-1 timesfor(unsigned int i=0;i<num_count-1;i++){for(unsigned int j=0;j<num_count-i-1;j++){if(nums[j]>nums[j+1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;}}}}
优化代码:
void bubble_sort::bubble_sort_optimized_with_array(int nums[], int num_count){int exchanged = 0;for(unsigned int i=0;i<num_count-1;i++){exchanged = 0;for(unsigned int j=0;j<num_count-i-1;j++){if(nums[j]>nums[j+1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;exchanged = 1;}}if(0 == exchanged)break;}}
4.算法分析
以上实例和代码中我们可以看出,该算法中的主要操作也是比较和互换位置,比较为主,替换为辅。和选择排序不同的是,在冒泡排序中互换位置发生的更频繁。
在冒泡排序中,最坏情况下比较的次数为:
C(n) = (n-1)+(n-2)+...+1=n(n-1)/2;
在冒泡排序中,最坏情况下互换位置的次数为(将一个降序数列按升序排列,每比较一次,都需要互换位置):
C(n) = (n-1)+(n-2)+...+1=n(n-1)/2;
因此时间的复杂度为:O(n^2)
0 0
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 代码审查
- JDK源码中使用的设计模式
- 虚拟机下 linux minicom使用
- 黑马程序员——TreeSet集合储存自定义对象
- 雷观(十五):提高生产力和程序员价值的2种方法
- 冒泡排序
- Android -- 采用系统相册浏览指定路径下照片
- Java 应用程序 访问配置文件
- 笔记:深入理解JVM 第2章 Java内存区域与内存溢出
- git的工作流程
- 响应XUL元素的resize事件
- 结构型模式之Facade模式
- android开发之自定义dialog及dialog替换activity好处
- mongodb+nodejs