冒泡法--分析

冒泡法的基本原理:

1.给定n个数,从第一数字开始依次对相邻的两个数进行比较,当前面的数字大于后面的数字时,就交换位置。

2.经过一轮比较后,最大的数字将位于数组的最右边,即第n位。

3.然后对n-1位数字进行第二轮比较,直到剩下一个数字为止。

分析:

    1.从看到n个数,就知道这是需要用到for循环的。

  2.接下来就要需要思考,需要几个for循环呢?一般如果一个数字与其他数字进行比较的话,就是单个for循环,需要这种两两比较的话,就需要比较N趟,每趟N次,所以需要两个for循环。

  3.好,确定了是两个for循环了。在这种嵌套循环中,关键是确定边界值,也就是两for循环的界限。

     for(i=0;i<n;++i)

     for(j=0;j<   ;j++)

    空出的是第二个循环的边界,那怎么确定呢?就看我们比较了,我们在第一趟比较完成后,就确定了一个最大数,那第二趟只需要比较N-1个数就可以了,第三趟只需要比较N-2个数。

    这样的话,就可以确定出嵌套循环中的边界是n-i了。

    所以for循环为

        for(i=0;i<n;++i)

           for(j=0;j<n-i;j++)

  4.再循环中做什么呢?两两数字进行比较。若前一个数大于后一个数,则交换两者,即if(a[j]>a[j+1]) {swap(a[j],a[j+1])};

完整实例:

#include<stdio.h>

void Swape(int& a,int& b) //注意使用数组跟指针一样,需要地址符,不然实参没有传递

{  int temp;

  temp =a;

  a=b;

  b=temp; }

void BubbleSort(int* a,int n)

{

  for(int i=0;i<n;i++)

      for(int j=0;j<n-i-1;j++)//注意这个边界,应该是n-i-1,因为下面是a[j+1]。不然会超出边界。

      {

        if(a[j]>a[j+1])

            {     Swape(a[j],a[j+1]);    }

}

}

int main()

{  int a[]={3,4,6,2,7,1};

  int len = sizeof(a)/sizeof(a[0]);

  BubbleSort(a,len);

  for(int i=0;i<len;++i)

   {   printf("%d",a[i]);  }

return 0;

}

时间: 2024-12-28 11:46:23

冒泡法--分析的相关文章

C#版 选择法、冒泡法、插入法和快速排序法分析与对比(一)

前言 之前老师就讲过了选择法和冒泡法,之后又提到了插入法和排序法,今天做了一个小DEMO,对比了一下四种方法的效率,当然看了很多大牛也博客,其实算法还设计了时间复杂度和空间复杂度,对于这两个概念,我只能从表面上进行理解,其中涉及到了很多数学的问题,所以就不展开写了. 选择排序 冒泡法 插入法 快速排序法 这部分知识比较新,而且内容比较多,所以打算单独另外总结一遍博客,来详细的总结一下这个方法~ DEMO(比较三个算法所用时间) 先说一下设计的思路,生成要求个数的不重复的随机数,将随机数循环赋给l

冒泡法、选择法、插入法、二分法

小序 排序是非常重要且很常用的一种操作,有冒泡排序.选择排序.插入排序.希尔排序.快速排序.堆排序等多种方法.这里我们先简单介绍前三种排序算法和代码的实现,其余算法将在后续课程<数据结构>中学习到.算法只是一种思想,其实现依赖于数据结构,所以这里提取出一些典型的算法和数据结构,包括排序以及链表/堆栈/队列等结构的操作. ------------------------------------------------------ 冒泡法排序 数组中有N个整数,用冒泡法将他们从小到大(或从大到小)

数组的排序,冒泡法,快速排序法

1.冒泡法排序 /* * 冒泡法排序 :在要排序的一组数中,对当前还未排好序的范围内的全部数,自左而右对相邻的两个数 * 相邻的两个数的交换 */ public void bubbleSort(int[] num) { int temp = 0; for(int i=0;i<num.length-1;i++){ for(int j=0;j<num.length-1-i;j++){ if(num[j]>num[j+1]){ temp=num[j]; num[j]=num[j+1]; num

8. 冒泡法排序和快速排序(基于openCV)

一.前言 主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用. 二.冒泡法排序 冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2).主要思想如下: 分为内外循环,每次外循环确定一个大的数据的具体位置,如下实例: 从图中可以看出,进过两次外循环就可以得到排序结果,随后的8次循环都浪费了,为了避免这种情况,我们可以设置一个状态参数,用来表示内循环是否发生数据的交换,从而作为外循环是否退出的信号. 三.快速排序 快速排序是最有效的排序方法之一,其主要思

一个循环实现冒泡法排序(并没有什么卵用)

冒泡法时间复杂度为O(n^2) 这个是改不了的 不可能因为用一个循环实现,就变成了O(N)... 所以,并没有什么卵用,只是一种写代码的方式而已... //Swap 用宏实现 #define Swap(a,b,c) ((c)=(a),(a)=(b),(b)=(c)) //第一种方式,,,最简单的 void BubbleSortOneLoop(int ar[], int n) { int i = 0; int l = 0; while (i < n - 1)//i还是控制最外层 { if (ar[

数组排序(java)冒泡法

public class ArrayTest03{ /* Name:数组排序,冒泡法 Power by :Stuart Date:2015-4-23*/ public static void main(String args[]){ //定义一个integer数组 int array[]={0,1,4,8,5,4,10,9}; for(int i=0;i<array.length;i++){ //第二层循环从第一层循环的元素第一次后一个开始 for(int j=i+1;j<array.leng

数组-03. 冒泡法排序

数组-03. 冒泡法排序(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的元素.然后用同样的方法对前N-1个元素进行第二遍扫描.依此类推,最后只需处理两个元素,就完成了对N个数的排序. 本题要求对任意给定的K(<N),输出扫描完第K遍后的中间

数组-03. 冒泡法排序(20)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int i,j,n,k,a[100],tmp; 5 cin>>n>>k; 6 for(i=0;i<n;++i) 7 cin>>a[i]; 8 for(j=0;j<k;++j) 9 for(i=0;i<n-j-1;++i) //注意-1 10 if(a[i]>a[i+1]){ 11 tmp=a[i]; 12 a[i]=

排序算法之冒泡法

package chap02_Basic_Algorithms; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; public class SortAlgorithms { /** * 冒泡法排序 * * @param n */ static void bubbleSort(int[] n) { int j = n.length - 1; int i; int tmp; while