数据结构——排序——冒泡排序算法

冒泡排序Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n2)次交换,而插入排序只要最多O(n)交换。冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地执行(O(n2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也有可能把最好的复杂度降低到O(n)。在这个情况,在已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序和比较大小反过来,也可以稍微地改进效率。有时候称为往返排序,因为算法会从数列的一端到另一端之间穿梭往返。

使用冒泡排序为一列数字进行排序的过程

冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include <stdio.h>

void bubbleSort(int arr[], int count)
{
    int i = count, j;
    int temp;
    while(i > 0) {
        for(j = 0; j < i - 1; j++) {
            if(arr[j] > arr[j + 1]){
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        i--;
    }

}
int main()
{
    //测试数据
    int arr[] = {5, 4, 1, 3, 6};
    //冒泡排序
    bubbleSort(arr, 5);
    //打印排序结果
    for(int i = 0; i < 5; i++)
        printf("%4d", arr[i]);
}

使用标志的冒泡排序

如果已知数列基本有序,可采用一个标志,减少无谓的判断,提高效率

void bubbleSort(int d[], int size)  //假定两两交换发生在数组最后的两个位置
{
    int exchange = size - 1;
    while(exchange) {
        //记录下发生数据交换的位置
        int bound = exchange;
        exchange = 0;   //假定本趟比较没有数据交换
        for(int i = 0; i < bound; i++) {
            if(d[i] > d[i + 1]) {
                swap(&d[i], &d[i+1]);
                exchange = i;
            }
        }
    }
}

C语言泛型实现冒泡排序的算法

#include<stdio.h>
#include<stdlib.h>

// Completed on 2014.10.7 23:45
// Language: C99
//
// 版权所有(C)codingwu   (mail: [email protected])
// 博客地址:http://www.cnblogs.com/archimedes/

void swap(void *vp1, void *vp2, int size){
      char buffer[size];
      memcpy(buffer, vp1, size);
      memcpy(vp1, vp2, size);
      memcpy(vp2, buffer, size);
}

int cmp_int(const void *a , const void *b )
{
    return *(int *)a - *(int *)b;
}

int cmp_double(const void *a , const void *b )
{
     return *(double *)a > *(double *)b ? 1 : -1;
} 

void bubbleSort(void *base, int n, int elemsize, int(*cmp)(const void *, const void *))
{
    char *q = (char *)base;
    char *p = (char *)base + n * elemsize;
    while(p > q) {
        for(; q != p - elemsize; q += elemsize) {
            if(cmp(q, q + elemsize) > 0) {
                swap(q, q + elemsize, elemsize);
            }
        }
        q = (char *)base;
        p -= elemsize;
    }
}

int main(void)
{
    //测试数据
    int arr1[] = {5, 4, 1, 3, 6, 12, 8, 22, 34,76};
    //冒泡排序
    bubbleSort(arr1, 10, sizeof(int), cmp_int);
    //打印排序结果
    int i;
    for(i = 0; i < 10; i++)
        printf("%d ", arr1[i]);
    printf("\n");
    double arr2[] = {5.4, 4.8, 1.2, 3.4, 6.7, 12.12, 8.6, 22.12, 34.5, 76.3};
    bubbleSort(arr2, 10, sizeof(double), cmp_double);
    for(i = 0; i < 10; i++)
        printf("%.2f ", arr2[i]);
    printf("\n");
}

运行结果如下:

http://www.cnblogs.com/archimedes/p/bubble-sort-algorithm.html

时间: 2025-01-07 03:52:58

数据结构——排序——冒泡排序算法的相关文章

数据结构之--冒泡排序算法及改进

冒泡排序,是我们学习数据结构第一个排序算法,也是一种最常见和简单的排序算法. 排序原理: 我们把一个数组从左到右依次两两元素比较,比较完成一趟后,能确定最大(最小)值,放在最右边(最左边): 剩下的元素重复上述步骤,直到整个数组有序. 该算法时间复杂度一般为n2  . java实现代码如下: public class BubbleSort { public static void swap(int[] array, int a, int b) { array[a] = array[a] ^ ar

冒泡排序算法总结

冒泡排序算法是思路最简单.最直接的排序方法之一. 每遍历一遍,则将最大(或者最小)的一个数冒泡出来. 预先定义的排序类型.由于只是为了验证排序方法是否正确,所以此处只是简单的对10个元素进行排序检测.如下所示: #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }SqList; void swap(SqList *L,int i,int j) { int temp = L->r[i]; L->r[i] = L-&

《数据结构与算法分析:C语言描述》复习——第六章“排序”——冒泡排序

2014.06.17 01:04 简介: 冒泡排序是O(n^2)级别的交换排序算法,原理简单,属于必知必会的基础算法之一. 思路: 排序要进行N轮,每一轮从尾部逐个向前扫描,遇到逆序对就进行交换.确保每一轮把最小的元素交换到前面去.这个过程好比水中的气泡向上飘,所以叫冒泡排序.代码非常简单,所以语言描述反而显得麻烦了. 实现: 1 // My implementation for bubble sort. 2 #include <iostream> 3 #include <vector&

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

数据结构-排序算法总结

排序算法 算法分析 算法稳定性 如果一种排序算法不会改变关键码值相同的记录的相对顺序,则称为稳定的(stable) 不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法.例如,对于冒泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成a[j].key>=a[j+1].key,则两个相等的记录就会交换位置.再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

数据结构——排序——希尔排序算法

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换.V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(nlog2n).这比最好的比较算法的O(nlogn)要差一些. 希尔排序通过将比较

数据结构之------C++指针冒泡排序算法

C++通过指针实现一位数组的冒泡排序算法. 冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 代码: 1 /* 2 Name:冒泡排序算法 3 Copyright:Null 4 Author:小X 5 Date: 06-10-14 10:34 6 Description:C++通过指针实现一维数组的冒泡排序 7 */ 8 9 #include <iostream> 10 11 /* run this program using the console pa