一. 算法描述

  冒泡排序思想:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第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. SharePoint中Rating相关的字段。

      From: https://sharepoint.stackexchange.com/questions/194197/how-to-manipulate-likeby-nooflikes-rat ...

  2. OpenGL book list

      From: https://www.codeproject.com/Articles/771225/Learning-Modern-OpenGL   A little guide about mo ...

  3. mybatis 是如何与数据表对应上的 ?

    MyBatis也需要进行表和实体 的关联.我们查询的是表,返回的结果是实体类.这之间有一个对应关系. 如果说实体类的属性和表的列名一一对应,名字一样,那就自动解决了这个问题.但是如果实体类的属性和表的 ...

  4. "Ext 4.1 Grid 'el.dom' 为空或不是对象"问题的解决

    我在使用Ext 4.1 做Grid,IE下冒出这么个错误,导致表格完全显示不出来,换另外一个IE浏览器,有没有问题,呵呵,百思不得其解啊... 后来得出答案,即在grid相关代码周围套上Ext.onR ...

  5. [Algorithm] Construct String from Binary Tree

    You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...

  6. [Jade] Piped text

    Another way to add plain text to templates is to prefix a line with a pipe character (|). This metho ...

  7. jquery旋转图片

    今天介绍一款 jQuery 插件——jqueryrotate,它可以实现旋转效果.jqueryrotate 支持所有主流浏览器,包括 IE6.如果你想在低版本的 IE 中实现旋转效果,那么 jquer ...

  8. [Canvas]用透明PNG图在背景上画前景能不遮挡背景

    欲看动态效果请点击下载并用Chrome/Firefox浏览器打开index,html. 图例: 从效果可以明显的看到,五角星边缘和中心都没有对背景遮挡. 代码: <!DOCTYPE html&g ...

  9. 【Nodejs】使用request批量下载MP3,文件数量内容都没问题

    看来request远强于http.request是毋庸置疑的了. 代码如下: //====================================================== // 喜 ...

  10. 通过adb命令在Android设备中执行Java命令, 并调用so文件。

    一.难点一:无法复制so文件到/system/lib或者/vendor/lib下,提示只读 解决方法: 2.使用android device monitor放库进入到 /system/lib出现只读权 ...