C++ 冒泡排序数据结构、算法及改进算法

2016-02-19 10:03 8 1 收藏

图老师小编精心整理的C++ 冒泡排序数据结构、算法及改进算法希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

程序代码如下:
代码如下:

// BubbleSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include cmath
#include iostream
using namespace std;
#define  MAXNUM 20
templatetypename T
void Swap(T& a, T& b)
{
    int t = a;
    a = b;
    b = t;
}
templatetypename T
void Bubble(T a[], int n)
{//把数组a[0:n-1]中最大的元素通过冒泡移到右边
    for(int i =0 ;i n-1; i++)
    {
        if(a[i] a[i+1])
            Swap(a[i],a[i+1]);
    }
}
templatetypename T
void BubbleSort(T a[],int n)
{//对数组a[0:n-1]中的n个元素进行冒泡排序
    for(int i = n;i 1; i--)
        Bubble(a,i);
}
int _tmain(int argc, _TCHAR* argv[])
{
    int a[MAXNUM];
    for(int i = 0 ;i MAXNUM; i++)
    {
        a[i] = rand()%(MAXNUM*5);
    }
    for(int i =0; i MAXNUM; i++)
        cout a[i] "  ";
    cout endl;
    BubbleSort(a,MAXNUM);
    cout "After BubbleSort: " endl;
    for(int i =0; i MAXNUM; i++)
        cout a[i] "  ";
    cin.get();
    return 0;
}

但是常规的冒泡,不管相邻的两个元素是否已经排好序,都要冒泡,这就没有必要了,所有我们对这点进行改进。设计一种及时终止的冒泡排序算法:

如果在一次冒泡过程中没有发生元素互换,则说明数组已经按序排列好了,没有必要再继续进行冒泡排序了。代码如下:

代码如下:

// BubbleSort.cpp : 定义控制台应用程序的入口点。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

//
#include "stdafx.h"
#include cmath
#include iostream
using namespace std;
#define  MAXNUM 20
templatetypename T
void Swap(T& a, T& b)
{
    int t = a;
    a = b;
    b = t;
}
templatetypename T
bool Bubble(T a[], int n)
{//把数组a[0:n-1]中最大的元素通过冒泡移到右边
    bool swapped = false;//尚未发生交换
    for(int i =0 ;i n-1; i++)
    {
        if(a[i] a[i+1])
        {
            Swap(a[i],a[i+1]);
            swapped = true;//发生了交换
        }
    }
    return swapped;
}
templatetypename T
void BubbleSort(T a[],int n)
{//对数组a[0:n-1]中的n个元素进行冒泡排序
    for(int i = n;i 1 && Bubble(a,i); i--);
}
int _tmain(int argc, _TCHAR* argv[])
{
    int a[MAXNUM];
    for(int i = 0 ;i MAXNUM; i++)
    {
        a[i] = rand()%(MAXNUM*5);
    }
    for(int i =0; i MAXNUM; i++)
        cout a[i] "  ";
    cout endl;
    BubbleSort(a,MAXNUM);
    cout "After BubbleSort: " endl;
    for(int i =0; i MAXNUM; i++)
        cout a[i] "  ";
    cin.get();
    return 0;
}

改进后的算法,在最坏的情况下执行的比较次数与常规冒泡一样,但是最好情况下次数减少为n-1。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1593165.html

延伸阅读
关于迷宫,有一个引人入胜的希腊神话,这也是为什么现今每当人们提到这个问题,总是兴致勃勃(对于年青人,估计是RPG玩多了),正如虽然九宫图连小学生都能做出来,我们总是自豪的说那叫“洛书”。这个神话我不复述了,有爱好的可以在搜索引擎上输入“希腊神话 迷宫”,就能找到很多的介绍。 迷宫的神话讲述了一位英雄如何靠着“...
3号盘子的目标柱是C,但是已经有了1号盘子,我们最直觉的反映就是——将碍事的盘子搬到另一根柱子上面去。于是,我们要做的是(规律2):保存当前柱的信息(柱子号、应该搬动的最下面一块盘子的号,和它的目标柱),以备当障碍清除后回到现在的柱子继续搬,将当前柱转换为碍事的盘子所在的柱子。假设这样若干步后,我们将7号盘子从A搬到了C,此...
递归法和回溯法 有人说,回溯实际上是递归的展开,但实际上。两者的指导思想并不一致。 !-- frame contents -- !-- /frame contents -- 打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路...
节点类 #ifndef Node_H #define Node_H template class Type class Node //单链节点类 { public: Type data; NodeType *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {} Node(const Type &item, NodeType *p) : data(ite...
我看的两本教科书(《数据结构(C语言版)》还有这本黄皮书)都是以这个讲解队列应用的,而且都是银行营业模拟(太没新意了)。细比较,这两本书模拟的银行营业的方式还是不同的。 !-- frame contents -- !-- /frame contents -- 1997版的《数据结构(C语言版)》的银行还是老式的营业模式(究竟是1997年的事了),现在的很多地方还...

经验教程

711

收藏

95
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部