今天周末,无聊,回顾下数据结构,然后按对冒泡的理解随便写了个冒泡排序,通了!~,翻开经典:《JAVA数据结构和算法第二版》,看看经典是怎么写的。嗯,经典的思路是要好些,虽然比较次数一样,但是循环次数少很多,运行了下,啊!?怎么排序不对!?
如下我的代码:
package org.acooly.datastructure.sort;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.math.RandomUtils;
public abstract class Sort {
public static void main(String[] args) {
int dataSize = 10;
int[] data = new int[dataSize];
for (int i = 0; i < data.length; i++) {
int member = RandomUtils.nextInt(dataSize * 10);
if (!ArrayUtils.contains(data, member)) {
data[i] = member;
}
}
data = new int[] { 3, 21, 46, 75, 56, 39, 7, 95, 93, 1 };
printArray("原始数据: ", data);
bubbleSort(data);
printArray("经典冒泡排序: ", data);
System.out.println();
data = new int[] { 3, 21, 46, 75, 56, 39, 7, 95, 93, 1 };
printArray("原始数据: ", data);
myBubble(data);
printArray("我的冒泡排序: ", data);
}
/**
* 我的写法
* @param data
*/
public static void myBubble(int[] data) {
int swapCount = 0;
int loopCount = 0;
for (int j = 0; j < data.length - 1; j++) {
for (int i = 1; i < data.length; i++) {
if (data[i] < data[i - 1]) {
swap(data, i, i - 1);
swapCount++;
}
loopCount++;
}
}
System.out.println("交换次数:" + swapCount);
System.out.println("循环次数:" + loopCount);
}
/**
* JAVA数据结构和算法第二版的写法
* @param data
*/
public static void bubbleSort(int[] data){
int swapCount = 0;
int loopCount = 0;
for (int out = data.length - 1; out > 1; out--) {
for (int in = 0; in < out; in++) {
if(data[in] > data[in+1]){
swap(data,in,in+1);
swapCount++;
}
loopCount++;
}
printArray("out " + out + ": ", data);
}
System.out.println("交换次数:" + swapCount);
System.out.println("循环次数:" + loopCount);
}
/**
* 交换数组中两个元素的值
*
* @param data
* @param i
* @param j
*/
public static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
public static void printArray(String message, int[] data) {
System.out.println(message + ArrayUtils.toString(data));
}
}
运行结果:
原始数据: {3,21,46,75,56,39,7,95,93,1}
out 9: {3,21,46,56,39,7,75,93,1,95}
out 8: {3,21,46,39,7,56,75,1,93,95}
out 7: {3,21,39,7,46,56,1,75,93,95}
out 6: {3,21,7,39,46,1,56,75,93,95}
out 5: {3,7,21,39,1,46,56,75,93,95}
out 4: {3,7,21,1,39,46,56,75,93,95}
out 3: {3,7,1,21,39,46,56,75,93,95}
out 2: {3,1,7,21,39,46,56,75,93,95} //经典书中写法,到2就结束了?少了一次比较?
交换次数:18
循环次数:44
经典冒泡排序: {3,1,7,21,39,46,56,75,93,95}
原始数据: {3,21,46,75,56,39,7,95,93,1}
交换次数:19
循环次数:81
我的冒泡排序: {1,3,7,21,39,46,56,75,93,95}
代码中的in < out应该是in <= out才对吧?
不相信经典会错,然后COPY书中原始代码试试:
package org.acooly.datastructure.sort;
public 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,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 one,int two){
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
}
package org.acooly.datastructure.sort;
public class BubbleSortApp {
public static void main(String[] args) {
System.out.println("书中原始测试:");
int maxSize = 100;
ArrayBub arr;
arr = new ArrayBub(maxSize);
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();
arr = null;
System.out.println("我变了下数组数据的测试:");
//{ 3, 21, 46, 75, 56, 39, 7, 95, 93, 1 };
arr = new ArrayBub(maxSize);
arr.insert(3);
arr.insert(21);
arr.insert(46);
arr.insert(75);
arr.insert(56);
arr.insert(39);
arr.insert(7);
arr.insert(95);
arr.insert(93);
arr.insert(1);
arr.display();
arr.bubbleSort();
arr.display();
}
}
运行结果:
书中原始测试:
77 99 44 55 22 88 11 0 66 33
0 11 22 33 44 55 66 77 88 99
我变了下数组数据的测试:
3 21 46 75 56 39 7 95 93 1
3 1 7 21 39 46 56 75 93 95
貌似真有错?!
分享到:
相关推荐
在Java中,我们有排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索算法(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索)以及动态规划、贪心算法等。这些算法在不同...
《Java数据结构和算法(第二版)》是一本专为希望深入理解Java编程中的数据结构与算法的读者设计的书籍。这本书的特点是从基础知识逐步引导读者进入复杂领域,通过结合实际的Applet小程序,使得理论知识变得生动直观。...
《Java数据结构与算法(第二版)》是一本深度探讨Java编程中数据结构和算法的专著,包含源码分析,旨在帮助读者深入理解并掌握这些核心概念。数据结构是计算机存储、组织数据的方式,而算法则是解决问题或执行任务的...
《Java数据结构和算法中文第二版》是一本深入探讨计算机编程中核心概念——数据结构与算法的书籍。这本书由[美] Robert Lafore撰写,并由计晓云、赵研、曾希.狄小菡等专家翻译成中文,由中国电力出版社出版。这本书...
《Java 数据结构 算法 第二版》是一本深入探讨Java编程中数据结构和算法的权威书籍。这本书分为中文和英文两个版本,为读者提供了双语学习的便利。其中,英文版采用PDF格式,而中文版则为PDG格式。为了确保读者能够...
《Java数据结构和算法》(第2版)介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和...
* 冒泡排序的思想是假设有 N 个数据需要排序,则从第0 个数开始,依次比较第0 和第 1 个数据,如果第 0 个大于第 1 个则两者交换,否则什么动作都不做,继续比较第1 个第 2个,以此类推,直至所有数据都“冒泡” 到...
《Java数据结构和算法》第二版是一本深入探讨Java编程中数据结构与算法的权威书籍。这本书涵盖了在软件开发中至关重要的基础知识,旨在帮助程序员提升解决问题的能力和代码效率。高清扫描版提供了清晰的文本和图表,...
《Java数据结构与算法第二版》是一本深入探讨如何在Java编程环境中实现和应用数据结构与算法的权威著作。源代码和Applet演示是这本书的重要组成部分,为读者提供了直观的实践平台,帮助理解和掌握理论知识。 1. **...
《Java版数据结构与算法分析第二版》是一本深入探讨数据结构和算法的书籍,主要针对使用Java编程语言的学习者。这本书旨在帮助读者理解和掌握如何有效地设计和分析各种数据结构和算法,这对于提升编程能力、优化程序...
《Java数据结构和算法-带书签目录扫描版》是一本深入探讨Java编程语言中数据结构和算法的书籍。此扫描版特别包含了完整的书签目录,使得读者在电子版阅读时能够快速定位到所需章节,提高了学习和查阅的效率。 在...
综上所述,《Java数据结构与算法(第二版)》这本书主要介绍了数据结构和算法的基础知识及其在Java编程语言中的应用。通过对各种数据结构和算法的学习,读者可以更好地理解如何选择合适的数据结构来提高程序效率,并...
《Java数据结构和算法(第二版)》是由Robert编著的一本关于计算机科学核心领域的经典著作,主要关注如何在Java编程环境中实现和应用各种数据结构和算法。这本书的代码库包含了许多实例,可以帮助读者深入理解这些...
Java数据结构和算法中文第二版(扫描版)Java数据结构和算法中文第二版(扫描版)Java数据结构和算法中文第二版(扫描版)
常见的算法有排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序)、搜索算法(如线性搜索、二分搜索和哈希搜索)、图算法(如深度优先搜索和广度优先搜索)以及动态规划和贪心策略等。这些算法...
总之,《JAVA数据结构与算法-第二版》是一本全面、深入的教程,适合Java程序员、计算机科学学生和对算法有兴趣的读者。通过阅读和实践书中的内容,读者不仅可以提高编程技能,还能培养解决复杂问题的能力,为未来在...
Java数据结构和算法第二十二讲.avi Java数据结构和算法第二十五讲.avi Java数据结构和算法第二十八讲.avi Java数据结构和算法第二十六讲.avi Java数据结构和算法第二十四讲.avi Java数据结构和算法第二十讲.avi Java...
《Java数据结构和算法中文第二版》是一本深入探讨如何在Java编程环境中理解和应用数据结构与算法的权威著作。本书的随书代码和应用程序压缩包提供了丰富的实例和实践材料,帮助读者更好地掌握理论知识,并将其转化为...
《Java数据结构和算法第二版》是一本深入探讨如何在Java编程环境中应用数据结构和算法的书籍。在软件开发中,理解和熟练运用数据结构与算法是提升程序性能、优化解决方案的关键。下面,我们将详细探讨这些重要的概念...