冒泡的实现即优化

冒泡排序:

  设数组长为N。以升序为例。

  • 1
    比较相邻的2个前后的数据,如果前面数据大于后面的数据,则2个数据交换

  • 2
    这样对数组的第0个数据到第N-1个数据进行遍历,则最大的数据会沉到数组的第N-1个位置。

  • 3 N = N-1,如果N != 0
    就执行第二步。


1 void Bubble_Sort( int a[],  int N )
2 {
3 int i, j;
4
5 for( i = 0; i < N; ++i )
6 for( j = 1; j < N-i; ++j )
7 if( a[j-1] > a[j] )
8 swap( a[j-1], a[j] );
9 }

下面对其进行优化:

设置一个标志,如果某一趟遍历发生了交换则为true,如果没发生交换则为false。
如果某一趟遍历没发生交换,则表明已经排好序了。


 1 void Bubble_Sort( int a[],  int N )
2 {
3 bool flag = true;
4 int i;
5 int k = n;
6 while( flag )
7 {
8 flag = false;
9 for( i = 1; i < k; ++i )
10 if( a[i-1] < a[i] )
11 {
12 swap( a[i-1], a[i] );
13 flag = true;
14 }
15 --k;
16 }
17 }

再进行进一步优化:

如果100个数据,前10个无序,后90个有序且都大于前10个数据。那么在第一趟遍历时最后发生交换的位置必定小于10。切这个位置之后的数据必定已经有序了,记录下这个位置,则第二次遍历时从数组头部位置遍历到该位置即可。

时间: 2024-10-13 12:14:48

冒泡的实现即优化的相关文章

优化版的冒泡排序

;优化版的冒泡排序,最好的情况为线性阶 ,最坏的情况为平方阶 ;算法的最好情况,如一个拍好序列的数组那么做排序,那么就会有几行代码不会产生交换的情况 最坏的情况是全部都交换 ;code /* 此冒泡最好情况被优化为线性阶 最坏就是平方阶 */ void bubble(int arr[3],int n) { int bChange=1,i=0,j=0; for(i=0;i<n&&bChange==1;++i)//n次 { bChange=0; for(j=0;j<n;++j)//

Java 算法

1.简单的冒泡排序 1 //冒泡算法一共两种 2 // -----冒泡算法(1) 3 int a[]={23,69,4,58,1,20}; 4 for (int i = 0; i < a.length-1; i++) { 5 for (int j = i+1; j < a.length; j++) { 6 if(a[i]>a[j]){ 7 a[i]=a[i]+a[j]; 8 a[j]=a[i]-a[j]; 9 a[i]=a[i]-a[j]; 10 } 11 } 12 } 13 for (

一次二分法在python中的利用

此次博客来自我选修课的一次作业,初学python, 我的程序难免有许多不合理的地方,希望大家指正. 问题描述: 每个月信用卡都会提示你还钱,至少要还的是你借款数额的2%.但是信用卡机构要收取未还清金额的利息,即使你及时还了要求偿还的最少金额的钱,你仍旧要支付利息,利息要累积在仍欠的钱上面,也就是还没有还款的一部分. 譬如,你用信用卡透支了5000美金,年利率是18%,每个月最少要还款2%,如果你每个月都是按照最小额度,也就是2%进行支付,1年之后还有多少钱没还. 设计思想: 你可以这样来考虑.

Java学习笔记(Javase毕向东版视频)二.2

5.运算符:变量的意义就在于可以进行运算,运算需要用运算符来表示,分为以下几种 1 class test 2 { 3 public static void main(String[] args) 4 { 5 //赋值运算符 =(赋值) +=,-=,*=,/= 6 int a=1234,b; 7 8 /*算数运算符 +(加) -(减) *(乘) /(除) %(取余) ++(自增) --(自减) +(字符串连接) 9 *1.除法运算结果自动转换为int型. 10 *2.取余结果的正负取决于被除数 1

动画 | 大学四年结束之前必须透彻的排序算法

目录 如何分析一个"排序算法"? 开始分析冒泡"排序算法" 开始分析"插入排序算法" 开始分析"选择排序算法" 开始分析"希尔排序算法" 开始分析"快速排序算法" 开始分析"并归排序算法" 开始分析"基数排序算法" 开始分析"堆排序算法" 为什么插入排序要比冒泡排序更受欢迎? 现如今大学生学习排序算法,除了学习它的算法原理.代码

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu

jQuery事件对象的作用(利用冒泡事件优化)

事件中的Event对象容易被初学者忽略掉,可能大多时候初学者不知道怎么去用它,但有些时候它还是非常有用的 一个标准的"click"点击事件 $(elem).on("click",function(event){ event //事件对象 }) 在不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异.jQuery根据 W3C 标准规范了事件对象,所以在jQuery事件回调方法中获取到的事件对象是经过兼容后处理过的一个标准的跨浏览器对象 这里不在千篇一律的说方法的

交换排序------冒泡法 及其优化

上大学学数据结构的时候就学过  冒泡法,   作为比较经典的排序方式由于其时间复杂较高一直作为入门级的算法,虽然冒泡算法在实际应用中较少但是也是有一定的研究价值的,这里给出三种实现,第一种为原始算法时间复杂度为 O(n);  第二种为加入标志位, 使算法在待排序数据已成有序情况前提前结束:  第三种,记录每一趟排序后最后交换的两个元素中的较小下标并将其作为下次排序的上限, 使算法可以在待排序数据中直接跨过尾部已经有序的数据元素减少比较次数. 冒泡排序原始算法: #include <iostrea

优化以后的冒泡

int[] a={5,2,3,4,1,6,7,8,9}; boolean flag=true; int t=0; for(int j=0;j<a.length-1;j++) { for(int i=0;i<a.length-i-1;i++) { if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; flag=false; } if(flag==true) { break; } } } System.out.println(Arrays.toSt