双向冒泡

以整数升序排序为例来简单说明一下双向冒泡排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基本过程所决定了的。在此基础上改进了一下,下面的代码可以实现对奇数偶数分别排序:

#include
"stdafx.h"

#include
<stdio.h>

#include
<stdlib.h>

//一般的冒泡排序

void bubbleSort(int a[],int n)

{

    int i,
j, k;

    int temp;

    for (i
= 0; i < n; i++){   
//最多做n-1趟排序

        for(j
= 0 ;j < n - i - 1; j++){  

            if(a[j]
> a[j + 1]){   
//把大的值交换到后面

                temp
= a[j];

                a[j]
= a[j + 1];

                a[j
+ 1] = temp;

            }

        }           

        printf("第%d次排序结果:",
i + 1);

        for(k
= 0; k < n; k++){

            printf("%d\t",
a[k]);

        }

        //printf("\n");

    }

    printf("最终排序结果:
"
);

    for(k
= 0; k < n; k++){

        printf("%d\t",
a[k]);

    }

}

//改进版的冒泡排序(双向冒泡)

void bidBubbleSort(int a[],int n)

{

    int left,
right, t, l, r, j, i = 0;

    left
=0;

    right
= n -1;

    //双向冒泡算法,极大的减少了循环排序的次数

    while(left
< right)

    {

        //必须要给l和r赋值,否则若数组一开始就有序,则right=r中的r未赋值,即报错

        l
= left + 1;

        r
= right -1;

        //第一次循环将最大的值放到末尾

        for(j
= left; j < right; j++)

        {

            if(a[j]
> a[j + 1])

            {

                t
= a[j];

                a[j]
= a[j + 1];

                a[j
+ 1] = t;

                r
= j;

            }

        }

        right
= r;

        //第二次循环将最小的值放到了开头

        for(j
= right; j > left; j--)

        {

            if(a[j]
< a[j - 1])

            {

                t
= a[j];

                a[j]
= a[j - 1];

                a[j
- 1] = t;

                l
= j;

            }

        }

        left
= l;

        printf("第%d次排序结果:",
i + 1);

        i++;

        for(j
= 0; j < n; j++){

            printf("%d\t",
a[j]);

        }

    }

     printf("最终排序结果:
"
);

    for(j
= 0; j < n; j++){

        printf("%d\t",
a[j]);

    }

}

int _tmain(int argc,
_TCHAR* argv[])

{

    int score1[]
= {98, 69, 75, 47, 89, 90, 100, 70};

    bubbleSort(score1,
8);

    printf("\n");

    int score2[]
= {98, 69, 75, 47, 89, 90, 100, 70};

    bidBubbleSort(score2,
8);

    system("pause");

    return 0;

}

下面是运行效果:

可见,双向冒泡排序能大大减少排序的次数,值得借鉴!!!

时间: 2024-10-24 11:23:18

双向冒泡的相关文章

OJ刷题之《双向冒泡排序》

题目描述 注:本题只需要提交填写部分的代码,请按照C++语言方式提交. 双向冒泡从小到大排序算法描述: (1)从当前序列的第1个元素开始,对相邻元素从前往后两两比较,不满足条件(从小到大)则彼此交换,一直到序列结束.此时最后1个元素为最大值. (2)从当前序列的倒数第2个元素开始,对相邻元素从后往前两两比较,不满足条件则彼此交换,一直到序列开始.此时第1个元素为最小值. (3)将第2个元素作为新序列的开始,倒数第2个元素作为新序列的结束,重复(1)-(2),直到新序列没有元素. 改进的双向冒泡从

双向冒泡排序算法--java

以整数升序排序为例来简单说明一下双向冒泡排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好.双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素.虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基

排序算法系列:冒泡排序与双向冒泡排序

概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的). 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50474230 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 冒

YDU 2748: 双向冒泡排序

2748: 双向冒泡排序 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 193  Solved: 100 [Submit][Status][Web Board] Description 注:本题只需要提交填写部分的代码,请按照C++语言方式提交. 双向冒泡从小到大排序算法描述: (1)从当前序列的第1个元素开始,对相邻元素从前往后两两比较,不满足条件(从小到大)则彼此交换,一直到序列结束.此时最后1个元素为最大值. (2)从当前序列的倒数第2个元

双向冒泡排序

<center><h2>问题 G: 双向冒泡排序</h2></center><h2>题目描述</h2><div class="content"><h1 style="margin: 0px; font-size: 30px; line-height: 36px; font-family: 'Times New Roman'; color: rgb(51, 51, 51); text-re

Problem D: 双向冒泡排序

Problem D: 双向冒泡排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 447  Solved: 197[Submit][Status][Web Board] Description 注:本题只需要提交填写部分的代码 双向冒泡从小到大排序算法描述: (1)从当前序列的第1个元素开始,对相邻元素从前往后两两比较,不满足条件(从小到大)则彼此交换,一直到序列结束.此时最后1个元素为最大值. (2)从当前序列的倒数第2个元素开始,对相邻元素从后

双向链表的双向冒泡排序 c++

1 #include<iostream> 2 3 using namespace std; 4 #define swap(a,b) {int t;t = a;a = b;b = t;} 5 //节点类型的定义 6 typedef struct node 7 { 8 int data; 9 node *prior, *next; 10 }Node, *pNode; 11 12 void TwoWayBubble(pNode &L); 13 void CreateList(pNode &a

C#12种顺序排序

这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数Random生成随机的集合. 其中数量五万左右的小数量排序,使用快速排序,速度最快.大数量百万左右使用鸽巢排序,速度最快.废话不多说,接下来上代码. 第一种:冒泡排序 冒泡排序我相信是每个程序员,都会学到的一种比较排序算法.非常简单,通过多次重复比较每对相邻元素,并按规定的顺序交换他们,最终把数列进行

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排