经典算法学习——冒泡排序

冒泡排序是我们学习的第一种排序算法。应该也算是最简单、最经常使用的排序算法了。

无论怎么说。学会它是必定的。

今天我们就用C语言来实现该算法。

演示样例代码已经上传至:https://github.com/chenyufeng1991/BubbleSort

算法描写叙述例如以下:

(1)比較相邻的前后两个数据。假设前面数据大于后面的数据,就将两个数据交换;

(2)这样对数组的第0个数据到N-1个数据进行一次遍历后。最大的一个数据就到了最后一个位置,也就是下标为N-1的位置(沉到了水底)。

(3)N = N-1,假设N不为0就反复(1)(2)两步,否则排序完毕。也就是对数组的第0个数据到N-2个数据再次进行遍历;

完整的代码实现例如以下:

//
//  main.c
//  BubbleSort
//
//  Created by chenyufeng on 16/1/28.
//  Copyright © 2016年 chenyufengweb. All rights reserved.
//

#include <stdio.h>

typedef int BOOL;
#define true 1
#define false 0

int *bubbleSort01(int arr[],int len);
void bubbleSort03(int arr[],int len);

int main(int argc, const char * argv[]) {

    int array[7] = {150,111,1000,99,300,10,189};

    /**
     *指针向后移位;
     */

    //    int *p = bubbleSort02(array, 7);
    //
    //    for (int i = 0; i < 7; i++) {
    //        printf("%d ",*(p+i));
    //    }

    /**
     *  能够使用传引用的方式,实现例如以下;
     这里不须要返回值,直接打印就可以,推荐使用这样的方式,方便。
     */
    bubbleSort04(array, 7);
    for (int i = 0; i < 7; i++) {
        printf("%d ",array[i]);
    }

    return 0;
}

//常规的冒泡;
int *bubbleSort01(int arr[],int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

//常规的冒泡,不须要返回值。
void bubbleSort03(int *arr,int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

当然也能够把上面的交换元素的代码抽取出来。写成一个交换函数swap。

代码实现例如以下:

//
//  main.c
//  BubbleSort
//
//  Created by chenyufeng on 16/1/28.
//  Copyright © 2016年 chenyufengweb. All rights reserved.
//

#include <stdio.h>

typedef int BOOL;
#define true 1
#define false 0

int *bubbleSort01(int arr[],int len);
void swap(int *a,int *b);

int main(int argc, const char * argv[]) {

    int array[7] = {150,111,1000,99,300,10,189};

    /**
     *指针向后移位;
     */

    //    int *p = bubbleSort02(array, 7);
    //
    //    for (int i = 0; i < 7; i++) {
    //        printf("%d ",*(p+i));
    //    }

    /**
     *  能够使用传引用的方式。实现例如以下;
     这里不须要返回值。直接打印就可以,推荐使用这样的方式,方便;
     */
    bubbleSort01(array, 7);
    for (int i = 0; i < 7; i++) {
        printf("%d ",array[i]);
    }

    return 0;
}

//常规的冒泡。
int *bubbleSort01(int arr[],int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

//                temp = arr[j - 1];
//                arr[j - 1] = arr[j];
//                arr[j] = temp;

                //这里也能够使用swap交换函数;
                swap(&arr[j - 1], &arr[j]);
            }
        }
    }
    return arr;
}

void swap(int *a,int *b){

    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

交换类排序:借助数据元素之间的相互交换进行排序的一种方法。如冒泡排序、高速排序。

插入类排序:将无序的各个元素依次插入到已经有序的线性表中。如直接插入排序、希尔排序。

选择排序:扫描整个线性表,选出最小的元素。将它交换到表的最前面。然后对剩下的继续相同的方法,直到子表为空。如直接选择排序、堆排序。

说明下,冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1).是一种稳定的排序。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

本文參考:http://blog.csdn.net/morewindows/article/details/6657829

时间: 2025-01-18 15:16:42

经典算法学习——冒泡排序的相关文章

经典算法学习——链表实现冒泡排序

我在之前一篇博客<经典算法学习--冒泡排序>中简单实现了使用数组进行冒泡排序.这篇博客我们将来实现使用链表如何排序,其实整体的思路是一样的.示例代码上传至: https://github.com/chenyufeng1991/BubbleSortLinkedList . 算法描述如下: (1)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换: (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就到了最后一个位置,也就是下标为N-1的位置(沉到了水底).

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)

我在前面两篇博客<经典算法学习--单链表(不带头结点)实现冒泡排序><经典算法学习--单链表实现冒泡排序(带头结点)>中详细描述了分别使用带头结点和不带头结点的单链表实现了冒泡排序,让我们对单链表和冒泡排序有了理性的认识.今天我们将会来使用不带头结点的非循环双向链表来实现冒泡排序,在处理过程中,这种冒泡比前面两种更为简单高效.代码上传至 https://github.com/chenyufeng1991/DoubleLinkedList_BubbleSort . 核心代码如下: /

Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

Javascript经典算法学习1:产生随机数组的辅助类

辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySortUtility(numOfElements) { this.dataArr = []; this.pos = 0; this.numOfElements = numOfElements; this.insert = insert; this.toString = toString; this.cle

经典算法学习——第一个只出现一次的字符

这同样是剑指Offer中的很经典的一道面试题.题目描述为:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'.  一开始大家就会想到最简单的方法就是每访问到一个字符的时候,与后面的每一个字符去进行比较,若没有发现相同的元素,那么该元素就是第一个只出现一次的字符.这样的复杂度为O(n^2).   显然这样的效率不高. 这道题的大方向就是一题查找算法,常见的查找算法为顺序查找,二分查找,哈希查找.比较适合这道题的是哈希查找.首先我们可以建立一个256长度的数组

经典算法学习——打印两个链表的第一个公共节点

求链表的公共节点是一道很经典的算法题,并不是很难.我们需要知道的是,一旦两个链表有一个公共节点的话,那么这两个链表的形状就是一个"Y"型.也就是说,自公共节点之后的所有节点都是一样的.如下: 其实只要看了这幅图,实现就很简单了.首先我们分别遍历两个链表,分别得出他们的长度L1,L2.然后在查找公共节点时,先在长的那个链表中走|L1-L2|步,然后两个链表同时向后进行同步遍历,每走一步时,就判断后面那个节点是否相同.若相同,则找到该第一个公共节点.完整代码上传至 https://gith

经典算法学习——链表中倒数第k个节点

这是剑指Offer中非常经典的一道题,也是在面试笔试中高频出现.题目的详细描述如下:输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第一个节点. 本题有一个非常直观的解法,就是对链表扫描两遍,第一遍用来记录链表长度为n,第二次从链表头部走(n-k+1)步后,找到的那个节点就是倒数第k个节点.这种算法的问题就是需要扫描链表两遍,显得不是特别聪明. 其实多想想,这个算法模型和栈的形式非常像,我们只要从头开始扫描链表,把扫描到的每一个节点放入栈中,扫

经典算法学习之分治法(以排列、组合程序为例)

分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治法在每层递归是遵循的三个步骤: (1)分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例. (2)解决这些子问题,队规的求解各个子问题,当子问题规模足够小的时候,直接求解. (3)合并这些子问题的解构成原问题的解. 显然归并排序是一个非常经典规矩的分治法的例子,鉴于之前已经写过一篇关于归并排序的博文,这里不在使用归并排序作为例子. 注意分治法的每一层递归

经典算法学习之贪心算法

贪心算法也是用来求解最优化问题的,相比较动态规划很多问题使用贪心算法更为简单和高效,但是并不是所有的最优化问题都可以使用贪心算法来解决. 贪心算法就是在每个决策点都做出在当时看来最佳的选择. 贪心算法的设计步骤: 1.将最优化问题转换为:对其做出一次选择之后,只剩下一个问题需要求解的形式(动态规划会留下多个问题需要求解) 2.证明做出贪心选择之后,原问题总是存在最优解,即贪心算法总是安全的 3.证明做出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最