zoukankan      html  css  js  c++  java
  • C语言排序算法——冒泡排序算法

    冒泡排序是一种交换排序,基本思想是:相邻两两比较,若反序则交换。

    定义交换操作函数:

    1 void swap(int *p, int i, int j)
    2 {
    3     int temp = p[i];
    4     p[i] = p[j];
    5     p[j] = temp;
    6 }

    基本排序算法:

    思想:i=0时,p[i]依次与后面的元素比较,如果后面的元素小,则交换位置,继续比较,直到将最小的元素交换到第一个位置,再从第二个开始与后面的比较。

    缺点:效率低。

     1 void BaseSort0(int *p)
     2 {
     3     int i,j;
     4     for(i=0;i<LEN;i++)
     5     {
     6         for(j=i+1;j<LEN;j++)
     7         {
     8             if(p[i]>p[j])
     9             {
    10                 swap(p,i,j);
    11             }
    12         }
    13     } 
    14 }

    冒泡排序算法:

    相邻两两比较。从序列后面开始向前冒泡,两两比较,反序交换位置。

     1 void BubbleSort1(int *p)
     2 {
     3     int i,j;
     4     for(i=0;i<10;i++)
    5 {
     6
    for(j=9;j>i;j--) 7 { 8 if(p[j]<p[j-1]) 9 { 10 swap(p,j-1,j); 11 } 12 } 13 } 14 }

    优化:

     1 void BubbleSort2(int *p)
     2 {
     3      int i,j;
     4      int flag=1;
     5      for(i=0;i<10&&flag;i++)    //如果没有交换,flag为0,跳出循环
     6      {
     7          flag = 0    //标签初始化
     8          for(j=9;j>i;j--)
     9          {
    10              if(p[j]<p[j-1])
    11              {
    12                  swap(p,j-1,j);
    13                  flag = 1;    //如果发生交换,标签置为1
    14              }
    15          }
    16      }
    17 }

    复杂度:

    最好情况:序列本身是有序的,根据最后优化的代码,比较次数为n-1,没有数据交换,时间复杂度O(n)

    最坏情况:序列本身是逆序的,需要比较1+2+3+...+(n-1)=n(n-1)/2次,并进行等数量级的记录移动,时间复杂度为O(n2)

  • 相关阅读:
    string与stringbuilder的区别
    Web负载均衡的几种实现方式
    JS 禁用鼠标右键
    JS中的!=、== 、!==、===的用法和区别。
    SQL Server Change Tracking
    关于更新发布CSS和JS文件的缓存问题
    Authorization in Cloud Applications using AD Groups
    英语学习[ZZ]
    我奋斗了18年,不是为了和你一起喝咖啡
    我奋斗了18年才和你坐在一起喝咖啡
  • 原文地址:https://www.cnblogs.com/DaLiNDluDlu/p/5257727.html
Copyright © 2011-2022 走看看