图解算法系列之冒泡排序(优化版)

算法描述

在第一层循环中设置一个变量,只要该序列局部有序就不需要进行排序了,提前终止循环。

图解算法

略.

C/C++代码实现

Custom.h

void BubbleSortAdvanced(int arr[], int number);

Custom.cpp

void BubbleSortAdvanced(int arr[], int number) {
    bool exchange;
    for(int i = 0; i < number; i++) {
        // 先设置为false
        exchange = false;
        for(int j = 0; j < number - 1; j++) {
            if(arr[j] > arr[j + 1]) {
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                // 如果有过一次改动表示这一个排序中所有数据是无序状态
                exchange = true;
            }
        }
        // 如果没有改动表示第一次在全局扫描所有元素的时候都是有序的不需要其他次数的扫描了
        if(!exchange) {
            return;
        }
    }
}

Java代码实现

public class BubbleSortAdvanced {
    public static void sort(int[] arr, int number) {
        boolean exchange;
        for (int i = 0; i < number; i++) {
            exchange = false;
            for (int j = 0; j < number-1; j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                    exchange = true;
                }
            }
            if (!exchange) {
                return;
            }
        }
    }
}

时间复杂度分析

最好情况下是O(n^2),但是数据如果本来有序就会提前结束。

原文地址:http://blog.51cto.com/xvjunjie/2329112

时间: 2024-07-31 08:28:14

图解算法系列之冒泡排序(优化版)的相关文章

图解算法系列之冒泡排序(Low版)

(1)算法描述 对于给定的线性序列,每一个元素与其下一个元素进行比较,如果满足大于当前元素就交换位置,然后依次向下比较.利用数学归纳法得知:N个元素总共比较N(N-1)次. (2)图解算法 (3) C/C++代码实现 Custom.h void BubbleSort(int arr[], int number); Custom.cpp void BubbleSort(int arr[], int number) { for (int i = 0; i < number; i++) { for(i

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

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

图解算法系列之插入排序(优化版)

(1)算法描述 对于给定的一个线性空间,遍历考察每一个元素,将当前元素拷贝一份,并将前一个元素拷贝到当前元素的原位置.拷贝出来的元素与前一个元素进行比较,如果满足前一个元素大于或小于当前元素就将当前拷贝出来的元素放到当前位置,否则继续向前比较. (2)图解算法 (3)C/C++代码实现 Custom.h void insertionAdvancedSort(int arr[], int number); Custom.cpp void insertionAdvancedSort(int arr[

白话经典算法系列之一 冒泡排序的三种实现

分类: 白话经典算法系列 2011-08-06 19:20 93923人阅读 评论(72) 收藏 举报 算法优化 冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N. 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换. 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置. 3.N=N-1,如果N不为0就重复前面二步,否则排序完成. 按照定义很容易写出代码: [cpp] view plaincopy //冒泡

图解算法系列之希尔排序

希尔排序 (1)算法描述 对于给定的线性序列,将这个序列按照一定规则进行分组,每个小序列使用插入排序的方法排序.由于是每个分组进行排序,序列总体只是局部有序,全局还是无序的.因此全部的分组进行一次排序后,再将小分组划分成更大的分组进行排序,直到只有一个分组,并且这个分组也是有序的.也就是说上面描述的分组是个增量分组.随着增量的减少,每个分组的元素逐渐变多.当增量减少至1的时候,整个线性序列就有序了. 理解增量分组 (2)图解算法 (3) C/C++代码实现 Custom.h void Shell

图解算法系列之插入排序(Low版)

(1)算法描述 对于给定的线性空间,依次考察每个元素,当指定的元素比后一个元素大(或者小)的时候就交换位置,然后交换过来的后一个元素继续向前比较,只要比该元素大(或者小)就两两交换,直到不符合交换条件或者到达最前端. (2)算法图解 (3)C/C++代码实现 CustomSort.h void insertionSort(int arr[], int number); CustomSort.cpp void insertionSort(int arr[], int number) { // 一次

白话经典算法系列之一 冒泡排序的三种实现 【转】

冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N. 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换. 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置. 3.N=N-1,如果N不为0就重复前面二步,否则排序完成. 按照定义很容易写出代码: //冒泡排序1 void BubbleSort1(int a[], int n) { int i, j; for (i = 0; i < n; i++) for (

图解算法系列之选择排序

选择排序 (1)算法描述 对于给定的一个线性空间,维护两个区域--"已排序区域"和"未排序区域".遍历每一个元素,找出该元素后边所有元素中,比当前元素绝对值相差最大的元素,与该元素交换位置. (2)算法图解 void selectionSort(int arr[], int number); CustomSort.cpp #include "CustomSort.h" void selectionSort(int arr[], int numbe

算法系列之&lt;冒泡排序&gt;

冒泡排序: 比较相邻两个元素的关键字值,如果反序,则交换.若按升序排序,每一趟将被扫描的数据序列中的最大元素交换到最后位置,就像气泡从水里冒出来一样. 复杂度分析: 数据的初始序列已排序,只需要一趟扫描,比较次数为n,移动次数为0,时间复杂度是O(N) 数据的初始序列反序排序,需要进行n-1趟扫描,时间复杂度是O(N2) 冒泡排序的平均时间复杂度是O(N2),每次交换需要一个辅助空间, 空间复杂度是O(1) 用java实现冒泡排序的代码如下: /** * 冒泡排序:依次比较相临元素,如果反序则进