数据结构之--冒泡排序算法及改进

冒泡排序,是我们学习数据结构第一个排序算法,也是一种最常见和简单的排序算法。

排序原理:

我们把一个数组从左到右依次两两元素比较,比较完成一趟后,能确定最大(最小)值,放在最右边(最左边);

剩下的元素重复上述步骤,直到整个数组有序。

该算法时间复杂度一般为n 。

java实现代码如下:

public class BubbleSort {
    public static void swap(int[] array, int a, int b)
    {
        array[a] = array[a] ^ array[b];
        array[b] = array[b] ^ array[a];
        array[a] = array[a] ^ array[b];
    }

    public static void sort1(int[] array, int length)
    {
        for(int i = 0; i < length -1; i++)
        {
            for (int j = 0; j < length - 1 - i; j++)
            {
                if (array[j] > array[j +1])
                    swap(array, j, j+1);
            }
        }

    }
}

该算法有一种改进算法,叫鸡尾酒排序,也叫定向冒泡排序。

我们可以同时遍历出最大和最小的数,并放在两边,后面继续重复上述步骤,某些情况下(比如数据大部分有序),会比第一种时间复杂度低。

JAVA实现如下:

public class BubbleSort {
    public static void swap(int[] array, int a, int b)
    {
        array[a] = array[a] ^ array[b];
        array[b] = array[b] ^ array[a];
        array[a] = array[a] ^ array[b];
    }

    public static void sort2(int[] array, int length)
    {
        int start = 0;
        int end = length -1 ;
        while(start < end)
        {
            for(int i = start; i < end; i++)
            {
                if (array[i] > array[i +1])
                    swap(array, i, i+1);
            }
            end --;for(int j = end; j > start; j--)
            {
                if (array[j] < array[j - 1])
                    swap(array, j, j-1);
            }
            start++;

        }
    }
}
时间: 2024-10-13 23:23:25

数据结构之--冒泡排序算法及改进的相关文章

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

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次

数据结构实践——归并排序算法的改进

本文是针对[数据结构基础系列(9):排序]的项目. [项目 - 归并排序算法的改进] 采用归并排序.快速排序等高效算法进行排序,当数据元素较少时(如n≤64),经常直接使用直接插入排序算法等高复杂度的算法.这样做,会带来一定的好处,例如归并排序减少分配.回收临时存储区域的频次,快速排序减少递归层次等. 试按上面的思路,重新实现归并排序算法. [参考解答] #include <stdio.h> #include <malloc.h> #include <stdlib.h>

冒泡排序算法总结

冒泡排序算法是思路最简单.最直接的排序方法之一. 每遍历一遍,则将最大(或者最小)的一个数冒泡出来. 预先定义的排序类型.由于只是为了验证排序方法是否正确,所以此处只是简单的对10个元素进行排序检测.如下所示: #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }SqList; void swap(SqList *L,int i,int j) { int temp = L->r[i]; L->r[i] = L-&

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组.每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变.由于较小的值像"气泡"一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序. 冒泡排序的图解是: 总结一句话就是:连续比较相邻的元素,降序则呼唤.有n个数,共需要比较n-1趟,第i趟,需要比较n-i次. BubbleSort.java public class BubbleSort {//时间复杂度O(n^2) public static void display(i

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

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

改进的冒泡排序算法二

/** * Project Name:Algorithm * File Name:BubbleSortImprove2.java * Package Name: * Date:2017年9月14日上午11:30:48 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ /** * ClassName:BubbleSortImprove2 * Function: 改进的冒泡排序算法, 测试数据集:6 3 5 7 0 4

数据结构之------C++指针冒泡排序算法

C++通过指针实现一位数组的冒泡排序算法. 冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 代码: 1 /* 2 Name:冒泡排序算法 3 Copyright:Null 4 Author:小X 5 Date: 06-10-14 10:34 6 Description:C++通过指针实现一维数组的冒泡排序 7 */ 8 9 #include <iostream> 10 11 /* run this program using the console pa

js冒泡排序算法改进

// 冒泡排序算法 function bubbleSort(arr) { console.log('排序算法第0次:' + arr.join(',')); var len = arr.length; var lastIndex = 0; // 最后标记的脚标 var sortBorder = len - 1; // 需交换最大的次数 for (var i = 0; i < len - 1; i++) { let isSort = true; for (var j = 0; j < sortBo

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法