一. 算法描述

  冒泡排序思想:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数"滚动"到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置......第n-1(n为无序数据的个数)趟即能完成排序。

  举个例子:5 7 9 3 6 2 8

  第一趟: 5 7 9 3 6 2 8    第二趟:5 7 3 6 2 8 9    第三趟:3 5 6 2 7 8 9

       5 7 9 3 6 2 8        5 3 7 6 2 8 9        ........

       5 7 3 9 6 2 8        5 3 6 7 2 8 9

       5 7 3 6 9 2 8        5 3 6 2 7 8 9

       5 7 3 6 2 9 8        5 3 6 2 7 8 9

       5 7 3 6 2 8 9

二. 算法实现

#include<stdio.h>

/*
* author:Knife
* time:2014.06.12 20:56
*/
void main_bubbleSort1(){
int intArr[] = {,,,,,,,,,};
int n = sizeof(intArr)/sizeof(intArr[]); // 计算整型数组的长度
int i,j,tmp;
//冒泡排序
for(i = ; i < n; i++){
for(j = ; j<n-i-; j++){
if(intArr[j]>intArr[j+]){
tmp = intArr[j+];
intArr[j+] = intArr[j];
intArr[j] = tmp;
}
}
}
//输出
for(i = ; i < n; i++){
printf("%d ",intArr[i]);
}
printf("\n");
}

三. 算法分析

  •   平均时间复杂度:O(n^2)
  •   空间复杂度:O(1)  (用于交换)
  •   稳定性:稳定

四. 算法优化

  优化思路:还可以对冒泡排序算法进行简单的优化,用一个标记来记录在一趟的比较过程中是否存在交换,如果不存在交换则整个数组已经有序退出排序过程,反之则继续进行下一趟的比较。

#include<stdio.h>

void main(){
void DataSwap(int* data1, int* data2);
void BubbleSort(int* pDataArray, int iDataNum); int intArr[] = {,,,,,,,,,};
int n = sizeof(intArr)/sizeof(intArr[]); // 计算整型数组的长度 BubbleSort(intArr, n); //输出
for(int i = ; i < n; i++){
printf("%d ",intArr[i]);
}
printf("\n");
} //交换data1和data2所指向的整形
void DataSwap(int* data1, int* data2)
{
int temp = *data1;
*data1 = *data2;
*data2 = temp;
} /********************************************************
*函数名称:BubbleSort
*参数说明:pDataArray 无序数组;
* iDataNum为无序数据个数
*说明: 冒泡排序
*********************************************************/
void BubbleSort(int* pDataArray, int iDataNum)
{
bool flag = false; //记录是否存在交换
for (int i = ; i < iDataNum - ; i++){ //走iDataNum-1趟
flag = false;
for (int j = ; j < iDataNum - i - ; j++){
if (pDataArray[j] > pDataArray[j + ]){
flag = true;
DataSwap(&pDataArray[j], &pDataArray[j + ]);
}
}
if (!flag){ //上一趟比较中不存在交换,则退出排序
break;
}
}
}

参考资料

[1] http://blog.csdn.net/cjf_iceking/article/details/7911027

【Algorithm】冒泡排序的更多相关文章

  1. 常见的排序算法之Java代码解释

    一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...

  2. Go语言排序算法实现

    // Algorithm project Algorithm.go package Algorithm // 冒泡排序 func BubbleSort(a []int) { n := len(a) ; ...

  3. 排序算法 (sorting algorithm)之 冒泡排序(bubble sort)

    http://www.algolist.net/Algorithms/ https://docs.oracle.com/javase/tutorial/collections/algorithms/ ...

  4. 数据结构(DataStructure)与算法(Algorithm)、STL应用

    catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...

  5. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  6. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  7. 冒泡排序最佳情况的时间复杂度,为什么是O(n)

    冒泡排序最佳情况的时间复杂度,为什么是O(n) 我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第 ...

  8. python算法之冒泡排序和选择排序

    一.冒泡排序(Bubble sort) Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorith ...

  9. 排序算法之冒泡排序的思想以及Java实现

    1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...

随机推荐

  1. A Complete ActiveX Web Control Tutorial

    A Complete ActiveX Web Control Tutorial From: https://www.codeproject.com/Articles/14533/A-Complete- ...

  2. URL重写2.1.mis

    概观 IIS URL重写2.1使Web管理员能够创建强大的规则来实现更容易让用户记住的网址,并使搜索引擎更容易找到.通过使用规则模板,重写映射,.NET提供程序和集成到IIS管理器中的其他功能,Web ...

  3. 使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别

    这是一篇国外的文章,介绍如何通过 WebRTC.OpenCV 和 WebSocket 技术实现在 Web 浏览器上的人脸识别,架构在 Jetty 之上. 实现的效果包括: 还能识别眼睛 人脸识别的核心 ...

  4. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  5. Fiber Channel SAN Storage

    http://www.infotechguyz.com/VMware/FiberChannelSANStorage.html Using Fibre Channel with ESX/ESXi Fib ...

  6. C++ 第三课:常量转义字符

    常量转义字符 以下的转义字符使普通字符表示不同的意义. 转义字符 描述 \' 单引号 \" 双引号 \\ 反斜杠 \0 空字符 \a 响铃 \b 后退 \f 走纸 \n 换行 \r 回车 \ ...

  7. C#(WPF和WinForm)在普通类中调用到主线程的方法,SynchronizationContext的用法。

    一.SynchronizationContext类用法: 1.对于WindowsFrom应用程序,如果想在某个类中,不方便使用到控件的Invoke方法时,可以使用WindowsBase.dll下的Sy ...

  8. C#用openfiledialog文件和savefileDialog打开和保存文件

    一 打开文件 Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog ...

  9. infobright系列一:源码安装infobright

    1:下载infobright http://www.infobright.org/downloads/ice/infobright-4.0.7-0-src-ice.tar.gz 2:查看环境 rpm ...

  10. V-rep学习笔记:Reflexxes Motion Library 2

    VREP中的simRMLMoveToPosition函数可以将静态物体按照设定的运动规律移动到指定的目标位置/姿态.If your object is dynamically enabled, it ...