数据结构学习之冒泡算法
2016-03-18 10:05
295 查看
class ArrayBub{ private long[] a; private int nElems; public ArrayBub(int max) { a = new long[max]; nElems = 0; } public void insert(long value) { a[nElems] = value; nElems++; } public void display() { for (int j = 0; j < nElems; j++) { System.out.print(a[j] + " "); } System.out.println(" "); } public void bubbleSort() { int out; int in; for (out = nElems - 1; out > 1; out--) { for (in = 0 ; in < out; in++) { if (a[in] > a[in+1]) swap(in,in+1); } } } private void swap(int n1,int n2){ long temp = a[n1]; a[n1] = a[n2]; a[n2] = temp; } } public class bubbleSort { public static void main(String[] args) { ArrayBub arr = new ArrayBub(100); arr.insert(77); arr.insert(99); arr.insert(44); arr.insert(55); arr.insert(22); arr.insert(88); arr.insert(11); arr.insert(00); arr.insert(66); arr.insert(33); arr.display(); arr.bubbleSort(); arr.display(); } }
算法思路
将最大的数据项放在数组的最后面。外层for循环的计数器out从数组的最后面开始,即out等于nElems-1,每经过一次out-1。下标大于out的都是已经排序好的,变量out在每完成一次内部循环(计数器减一)向左一位,一次算法就不用再处理那些排序好的数据。
内层for循环的计数器in从数组的最左边算起,内部循环体每次自增1,当等于out的时候结束循环。
第一次外层循环,out=9,进入内循环,比较a[0]和a[1],然后两者间的较大值与a[2]比较,以此类推,一直比较到a[8]{这个理解很重要,因为并不会立刻比较到a[9],下面有一个a[n+1],故这里面就是最大为a[8],然后让这个最大的a[8]去和a[9]比较,也可以理解为in实际上最大就是nElmes-2}这9个数,找出其中的最大数,然后放在a[9]的位置。
定义了一个数组类,主函数中创建了一个数组对象,通过圆点运算符来访问和调用它的数据和方法,在这个数组类中定义了一个insert()方法(用来对数组插入),一个display()方法(用来打印数据),一个bubbleSort()方法,就是本程序的核心,swap()方法用来实现bubbleSort()。
这里将方法全部定义在数组类中,是为了在主函数中不进行方法的编写,使得代码看起来更加简洁,这样容易维护。
冒泡算法的效率:
若数组中有N个数据项,则需要比较的次数为N+(N-1)+(N-2)+…+1=N*(N-1)/2
忽略减一,且大O算法中不算常数,故需要O(N^2)时间级别。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)