冒泡排序法笔记
来源:互联网 发布:网络t客人来ktv 编辑:程序博客网 时间:2024/04/29 02:40
冒泡排序简介
冒泡排序法是一种简单并且常用的排序算法。其基本目的是对数组或列表中的数据进行由小到大的排序。
//以下为冒泡排序中一次排序的逻辑,其中array是目标数组,count为数组长度for(int i = 0; i < count - 1; i++){ if(array[i] > array[i+]) { int temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; }}
由上面的代码片段可以看出,冒泡排序的实质就是从第一个元素开始,将第i位与第i+1位的元素进行比较。 如果前一位大于后一位就进行对掉,如果前一位小于或者等于后一位则不做调换。 例如: //给定一个数组 int[] array = new int[]{50, 10, 7, 3, 1}; count = array.length //count = 5 此数组经过一次以上的for循环后将会变为{10, 7, 3, 1, 50} 可以看出,50从第一位被调换到了最后一位,这就是冒泡排序法。但是只经过一次排序还无法将所有元素的位置进行正确的定位。 所以需要进行第二次排序,结果为{7, 3, 1, 10, 50}; 第三次排序,结果为{3, 1, 7, 10, 50}; 第四次排序,结果为{1, 3, 7, 10, 50}; 可见,通过4次排序后最终这个有5个元素的int类型数组已经变成了一个由小到大排序的数组。 所以冒泡排序法的基础原理代码为:
//进行count-1次排序,将数组进行完全的排序for(int j = 0; j < count - 1; j++){ //单独排序一次的逻辑 for(int i = 0; i < count - 1; i++) { if(array[i] > array[i+]) { int temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; } }}
第一种优化方案
由以上示例可以看出,因为在第一次进行排序时就已经把数组中最大的元素(50)排到了最后一位。 所以在第二次排序时,实际上完全不需要讲当前最大元素(10)和最后一个元素(50)进行比较。 而第三次排序时,也不需要讲当前最大元素(7)后最后两个元素比较。 以此类推:
//经过优化过的代码片段,最外层的for循环没有变化。for(int j = 0; j < count - 1; j++){ //单独排序一次的逻辑,随着排序的进行,需要比较的元素数量会减少 //第一次时需要将数组中的所有元素进行比较,以后逐次递减 for(int i = 0; i < count - 1 - j; i++) { if(array[i] > array[i+]) { int temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; } }}
通过以上优化,可以减少不必要的运算,增加整体运算速度。
第二种优化方案
如果所需要比较的示例是类似{5,4,3,2,1}这种类型的数组的话,确实需要进行满次数4次的循环比较才可以将所有元素进行比较。 但如果是类似{5,1,2,3,4},或者更加极端点{1,2,3,4,5}这种已经是从小到大进行排序的数据时。 即使用上面优化过一次的算法也会造成不必要的浪费,所以才会有以下的优化方案:
//使用冒泡排序法进行比较的函数,传入一个int型数组void Sort(int[] sortArray){ //定义一个bool开关,对排序的最外层循环进行管理 bool swapped = true; do { //设置开关为false swapped = false; for (int i = 0; i < sortArray.Length - 1; i++) { if (sortArray[i] > sortArray[i + 1]) { int temp = sortArray[i]; sortArray[i] = sortArray[i + 1]; sortArray[i + 1] = temp; //如果进行了前后调换则说明排序没有完成。 //需要继续进行,将开关设置为true swapped = true; } } } while (swapped);}
此函数中的算法的核心部分和前面的算法没有区别,有区别的是外层的循环比较部分。 如需要比较的数组为{1,2,3,4,5}则在第一比较调用函数后,swapped这个控制开关就会变为false。 因为说明没有需要继续比较的必要了,所以while循环也会结束。 在处理不是必须所有元素都进行比较的数据时,此种优化算法要比之前的算法更加高效。
0 0
- 冒泡排序法笔记
- 冒泡排序学习笔记
- 冒泡排序笔记
- 算法笔记--冒泡排序
- 冒泡排序笔记
- 冒泡排序算法笔记
- 冒泡排序笔记整理
- 冒泡排序--学习笔记
- 冒泡排序自学笔记
- 【笔记】冒泡排序
- 【排序】冒泡排序法
- js 冒泡排序--学习笔记
- 算法学习笔记 - 冒泡排序
- php冒泡排序详解笔记
- 冒泡排序(笔记)0.0.1
- php冒泡排序详解笔记
- 黑马程序员关于数组、冒泡排序法的复习笔记
- 学习笔记1:冒泡排序, 快速排序
- 从算法上解读自动驾驶是如何实现的?
- Gym 101234A Just question (NO answer!!!)
- 神的主权与人的自由 (李建安)
- N皇后
- CSS3阴影 box-shadow的使用和技巧总结
- 冒泡排序法笔记
- [C++] 数据结构之顺序栈
- C语言头文件避免重复包含
- OpenGL学习总结(八)
- MyBatis中模糊查询
- bzoj3160 万径人踪灭
- phalcon 连接查询(phql)
- Find the next perfect square
- python set