【算法初级】排序 - “Bubble Sort”优化
来源:互联网 发布:用友软件操作流程 编辑:程序博客网 时间:2024/06/06 18:50
前些天写了一个比较“冒泡”和“直接选择”的博客,主要是从形式上对其进行对比(都套有两层for循环),但是从本质上来说,前者属于“交换排序”,而后者属于“选择排序”,还是不一样的。
鉴于这几天遨游在知识的海洋中,我发现了一些基本算法的优化策略,小菜介绍下对“冒泡”的两点优化。
算法原型:
//核心冒泡算法 - Bubblefor (int i = 0; i < arry.Length - 1; i++){for (int j = 0; j < arry.Length - i - 1; j++){if (arry[j] < arry[j + 1]){temp = arry[j];arry[j] = arry[j + 1];arry[j + 1] = temp;}}}
可以得知:外层for循环每走一趟,内层for循环会遍历交换相邻的数组元素,对于乱序的一列数组,这个方法很棒,但是应对与特殊情况,例如:
1、数列本身有序
2、数列从某个位置后有序
这个时候,再套用这个“double for循环”就有些浪费内存了,于是乎,就要优化了。
Condition 1:数列本身有序
思路:在内层for循环外加一个bool标识,如果内层某一趟循环未进行相邻位置交换,则改变该bool标识值。
代码:
void BubbleSort(int a[], int n) { //定义bool标识,在外层循环中赋初值,每一趟外层循环监听该bool值 bool flag; for (int i = 0; i < arry.Length - 1; i++) { flag = false; for (int j = 0; j < arry.Length - i - 1; j++) { if (arry[j] < arry[j + 1]) { temp = arry[j]; arry[j] = arry[j + 1]; arry[j + 1] = temp; flag = true; } } }}这样,只要发现了某一趟没有进行相邻交换,则证明该数列排序满足要求。
Condition2: 数列仅前X位无序,后面的有序
思路:如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
代码:
void BubbleSort2(int a[], int n) { int j, k; int flag; flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = j; } } }区别于上面的写法,定义一个int值而非bool值,用于记录索引从多少开始,后面值将不再改变,从而缩小循环遍历范围。
总结:这个月不忙,组长建议我平时学习下算法,每天下班前能学个1~2小时,可能是为了提高我敲的代码的逻辑性吧,总而言之,这些东西都是程序员的内功,建议朋友们也学习学习,对于编程思维很有锻炼意义。
- 【算法初级】排序 - “Bubble Sort”优化
- 算法--冒泡排序 Bubble Sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 排序算法-冒泡排序 Bubble Sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法 - 冒泡排序Bubble sort
- 经典排序算法---冒泡排序(bubble sort)
- 经典排序算法 - 冒泡排序Bubble sort
- hdu1044(bfs+dfs/bfs+状态压缩)
- POJ 1904 思路题
- Tesseract.js相关整理
- C#中内存流MemoryStream至FTP网络流Stream的无缝传输
- Play2.5 scala 学习记录
- 【算法初级】排序 - “Bubble Sort”优化
- 消息摘要算法简介
- Java: Map里面的键和值可以为空吗?
- nginx搭建rtmp协议流媒体服务器
- studio 快捷建
- adb查看安卓手机日志
- C++中引用(&)的用法和应用实例
- 有关GetMemory()问题的思考
- HDU 2767 Proving Equivalences(待完善)