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

什么是冒泡排序?

冒泡排序是一种交换排序,所谓交换,就是将相邻元素两两比较,如果反序则进行交换从而使元素有序。之所以叫冒泡排序是因为,元素是从最后开始进行两两比较,将小的元素放到最上面的位置,看上去就跟气泡往上冒一样。

代码实现

<span style="font-family:Courier New;font-size:14px;">#include <iostream>
#define MAXSIZE 10
using namespace std;
struct SqList {
    int r[MAXSIZE];
    int length;
};

//元素交换
void swap(SqList *L,int i,int j) {
    int temp;
    temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}
/**
    冒泡排序 共需进行n-1趟
    从最后一个元素开始依次与前一个元素进行比较,
    若小于前一个元素,则进行交换
*/
void BubbleSort(SqList *L) {
    int i,j;
    for(i=1;i<L->length;i++) {
        for(j=L->length-1;j>=i;j--) {
            if(L->r[j]>L->r[j+1]) {
                swap(L,j,j+1);
            }
        }

    }
}
/**

    增进版 冒泡排序
    这是为了再进行一两次比较后,元素已经有序了,
    后面不再需要进行比较排序了。
    比如序列:2,1,3,4,5,6,7,8,9
    当进行完依次比较后,此时序列为1,2,3,4,5,6,7,8,9
    那么此时已经有序了,因此后面就无序比较,直接退出循环就行
    所以,引入一个标志变量,当元素交换时置为true,没有时置为false
    则在外循环中,当变量为false时,就退出循环了,说明此时已经有序了
*/
void BubbleSort2(SqList *L) {
    int i,j;
    bool flag = true;
    for(i=1;i<L->length&&flag;i++) {
        flag = false;
        for(j=L->length-1;j>=i;j--) {
            if(L->r[j]>L->r[j+1]) {
                swap(L,j,j+1);
                flag = true;
            }
        }
    }
}
void Print(SqList *L) {
    for(int i=1;i<=L->length;i++) {
        cout<<L->r[i]<<" ";
    }
    cout<<endl;
}

int main()
{
    SqList s={{0,9,1,5,8,3,7,4,6,2},9}; //0为占位
    cout<<"排序前:"<<endl;
    Print(&s);
    BubbleSort(&s);
    cout<<"排序后:"<<endl;
    Print(&s);
    return 0;
}
</span>
时间: 2024-12-28 01:03:05

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

数据结构与算法-----冒泡排序

冒泡排序的基本思想,就是相邻的两个数字进行比较,如果它们的顺序错误,就把它们交换过来.什么是顺序错误呢?比如我们按从大到小进行排列,那么应该是大的数在前面,小的数在后面,两个数如果是45,98这么排列,它们就是顺序错误,我们就要把它们交换过来,变为45,98; 现在我们就按照上面的基本思想,对5个数12, 35, 99, 8, 100进行降序排列. 1, 首先比较第1个数和第2个数:12,35,由于是降序排列,越小的数应该越在后面, 而在这里12 比35小,却排在了前面, 不符合要求,就是顺序错

数据结构与算法—冒泡排序(Java实现)

[toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] arr = {8, -2, 3, 9, 0, 1, 7, 6}; System.out.println("排序前:" + Arrays.toString(arr)); bu

数据结构与算法——冒泡排序(改进后)

//改进的冒泡程序#include<stdio.h>void BubbleSort(int arr[], int length); int main( ){ int i; int arr[9] = {1,1,5,7,2,4,9,6,8}; int length=sizeof(arr)/sizeof(arr[0]); BubbleSort(arr,length); for(i=0;i<length;i++) { printf("%d ",arr[i]); } } voi

《数据结构与算法之美》——冒泡排序、插入排序、选择排序

排序,是每一本数据结构的书都绕不开的重要部分. 排序的算法也是琳琅满目.五花八门. 每一个算法的背后都是智慧的结晶,思想精华的沉淀. 个人觉得排序算法没有绝对的孰优孰劣,用对了场景,就是最有的排序算法. 当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析. 我们如何分析一个算法? 排序算法的执行效率 1.最好.最坏和平均情况的时间复杂度 2.时间复杂度的系数.常数和低阶 一般来说,在数据规模n很大的时候,可以忽略这些,但是如果我们需要排序的数据规模在几百.几千

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

数据结构与算法1

数据结构与算法(一),概述 转载请注明出处:http://www.cnblogs.com/wangyingli/p/5919297.html 数据结构学了有一年的时间了,但是一直没有好好的总结一下,现在回想起来,感觉好像都不怎么记得了.所以接下来一段时间我将重新学习一下,算是温故而知新了.本着「分享是一种美德」的精神,我将把我的学习总结记录下来,并与大家分享. 本节的主要内容有: 一.数据结构 1.定义 2.关于数据结构的几个术语 3.逻辑结构与物理结构 二.抽象数据类型 三.算法 四.算法的复

数据结构与算法

1. 解决一个复杂的问题的时候,肯能先想到的是如何建模,建模之后,怎么去求解这个问题.求解一个问题的时候,需要用到算法的时候,我们应该想到的是该算法需要什么样的数据结构.可能涉及一个算法最原始的数据结构,可能就比较复杂. 怎么样对一个算法来进行优化,我想从学完数据结构的角度来谈谈,总共有3个方面: 第一:可能就是算法本身,比如在排序过程中,我们知道快速排序在相对的情况下,要比冒泡排序更加高效,这就是为什么都是排序,我们为什么不选择好的算法,从算法本身来下手呢? 第二:可能就是合适的数据结构,能够

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

数据结构与算法系列 目录

最近抽空整理了"数据结构和算法"的相关文章.在整理过程中,对于每种数据结构和算法分别给出"C"."C++"和"Java"这三种语言的实现:实现语言虽不同,但原理如出一辙.因此,读者在了解和学习的过程中,择其一即可! 下面是整理数据数据和算法的目录表,对于每一种按照C/C++/Java进行了划分,方便查阅.若文章有错误或纰漏,请不吝指正.谢谢! 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表