排序算法杂谈(二) —— 冒泡排序的递归实现

众所周知,循环和递归,在很多情况下是可以互相转换的。

那么,冒泡排序(Bubble Sort),作为典型的双重循环结构,也可以将其转化成递归形式。

但是,将递归转化为循环,对于程序的运行是有益的,因为它避免了不可预知的“方法压栈”的现象出现。

而将循环化为递归,多数情况下,不推荐这么做,即使递归的代码可能实现地非常漂亮。漂亮与高效往往是冲突的。

所以,以下的冒泡排序仅作参考,读者可以用它来拓宽思维。但是,永远不要这样写冒泡排序!

public final class BubbleSortRecursion implements Sort {

    @Override
    public void sort(int[] array) {
        recursion(array, 0, array.length - 2);
    }

    private void recursion(int[] array, int left, int right) {
        if (right > 0) {
            if (array[left] > array[left + 1]) {
                ArrayHelper.swap(array, left, left + 1);
            }
            if (left >= right) {
                recursion(array, 0, right - 1);
            } else {
                recursion(array, left + 1, right);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/jing-an-feng-shao/p/9078826.html

时间: 2024-10-13 23:14:40

排序算法杂谈(二) —— 冒泡排序的递归实现的相关文章

排序算法之二---冒泡排序

冒泡的基本思路:从元素最后处开始向前多遍扫描(邻位比较),遇到逆序元素就交换位置,使得每次扫面都能将扫面区中的最小值移至最前位置 #include <stdio.h> void bubble_sort(int arr[] ,int length) { int i,j; for (i = 0; i < length; i++){ for (j = length-1; j>i ; j--){ if (arr[j-1] > arr[j]){ int tmp = arr[j-1];

排序算法--(二)

选择排序 直接选择排序: 选择排序,每一趟找到一个最小(大)值,每一趟遍历的数据减少一次. template <typename T> void SelectSort(T a[],int length) { T temp; for (int i=0;i<length;i++) { int k =i; for (int j=i+1;j<length;j++) { if (a[j]<a[k]) k=j; //这里只是对比它小的元素中最小的位置进行标记,每次相当于最多移动一次. }

排序算法杂谈(五) —— 关于快速排序的优化策略分析

1. 前提 排序算法(六) -- 归并排序 排序算法(七) -- 快速排序 排序算法杂谈(四) -- 快速排序的非递归实现 2. 优化策略1:主元(Pivot)的选取 归并排序(Merge Sort)有一个很大的优势,就是每一次的递归都能够将数组平均二分,从而大大减少了总递归的次数. 而快速排序(Quick Sort)在这一点上就做的很不好. 快速排序是通过选择一个主元,将整个数组划分(Partition)成两个部分,小于等于主元 and 大于等于主元. 这个过程对于数组的划分完全就是随机的,俗

排序算法之从冒泡排序所想到的

1.算法思想描述: 1)将相邻的两个数进行比较,如果前面的一个大于后面的一个,则将他们交换.每次循环能使一个数达到有序状态. 2.时间复杂度: 平均O(n^2).最佳:O(n),在序列一开始就是正序的时候取得 3.实现及优化. 以下给出三种实现方式 /* * bubblesort.cpp * * Created on: 2014年5月17日 * Author: pc */ #include <iostream> #include <cstdio> #include <ctim

学习排序算法(二):Pairwise方法之Ranking SVM

学习排序算法(二):Pairwise方法之Ranking  SVM 1. Pairwise方法的基本思想 Pairwise考虑了文档顺序的关系.它将同一个query的相关文档其中起来,把任意两个文档组成一个pair.我们研究就是以这个pair文档对来研究的. 2. Ranking SVM 在测试的时候,我们就把一个query的所有结果先构建所有可能的pair,然后输入到学习到的模型中,得到每个pair的相对顺序.根据推算就可以得到所有搜索结果的排序了. 典型的Pairwise方法就有rankin

学习排序算法(二):Pairwise方法之RankNet

学习排序算法(二):Pairwise方法之RankNet 前面一篇博文介绍的Ranking SVM是把LTR问题转化为二值分类问题,而RankNet算法是从另外一个角度来解决,那就是概率的角度. 1. RankNet的基本思想 RankNet方法就是使用交叉熵作为损失函数,学习出一些模型(例如神经网络.决策树等)来计算每个pair的排序得分,学习模型的过程可以使用梯度下降法. 2. 方法流程 首先,我们要明确RankNet方法的目的就是要学习出一个模型,这个模型就是给文档算法的函数f(d, w)

排序算法总结之冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它的基本思想就是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 例如:初始序列3,6,4,2,11,10,5:从头开始,两两相比,若a[i]>a[i+1],则将两者交换: 从上面的排序过程来看,其实在第2趟结束后,数据序列就已经是有序的了

常见的排序算法(二) 交换排序(冒泡排序,快速排序)

今天,给大家带来的是交换排序. 首先,我们来了解一下什么叫交换排序.所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动.   那么接下来,我们来看一下.冒泡排序. 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排

复习数据结构:排序算法(二)——冒泡排序

这篇复习冒泡排序.     冒泡排序也是一种稳定排序.内排序. 冒泡排序的基本思想:对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 插入排序比冒泡排序快! 上面说的是普通的冒泡排序算法,时间复杂度是O(n^2),这种方法只能一趟排序操作只能找到一个最大值或最小值,消耗时间太多.     改进方法1:我们可以让每趟排序中进行正向和反向两遍冒泡的方法,一次就可以同时得到

排序算法总结二

本文接排序算法总结一 3. 冒泡排序 冒泡排序的基本思想:以正序排列为例,我们首先要将最大的数沉到最底下,从第一个数开始,比较相邻的两个数,如果为逆序则交换这两个数,重复这个操作直到倒数第二个数,此时最大的数已沉到最底下:然后再从第一个数开始,用同样的方法将次大的数沉到次底下,重复这个过程直到排序成功.代码如下: void PaoSort1(vector<int>& a) { int length = a.size(); for (int i = 0; i < length -