`

JAVA数据结构和算法第二版书中冒泡排序貌似有错?

 
阅读更多

今天周末,无聊,回顾下数据结构,然后按对冒泡的理解随便写了个冒泡排序,通了!~,翻开经典:《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 
 

 

貌似真有错?!

 

0
1
分享到:
评论
2 楼 zp820705 2011-07-11  
你说的对,受教。
1 楼 sjzzdf 2011-07-10  
for (int i = 1; i < data.length; i++) {  
                if (data[i] < data[i - 1]) {  
                    swap(data, i, i - 1);   ????你冒泡排序的j呢?没用上?而且你冒泡的算法似乎就没搞清楚。

下面是我写的:
public class BubbleSort{
public static void main(String[] args) throws Exception{

int []ary=new int[]{9,8,7,6,4,2,4};
int len=ary.length;
for(int i=0;i<len-1;i++)
  for(int j=i+1;j<len;j++)
    {
     if(ary[j]<ary[i]){
          int temp=ary[j];
          ary[j]=ary[i];
          ary[i]=temp;

       } 

     }
for(int k=0;k<len;k++)
{System.out.print("  "+ary[k]);}

}

}

相关推荐

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    Java数据结构和算法中文第二版

    根据提供的信息,“Java数据结构和算法中文第二版”这本书主要关注的是数据结构与算法的相关内容。下面将基于这些信息,详细介绍数据结构与算法的核心概念、重要性和应用领域,以及在Java编程环境中如何实现这些概念...

    Java数据结构和算法(第二版)+源代码+Applets

    在Java中,我们有排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索算法(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索)以及动态规划、贪心算法等。这些算法在不同...

    Java数据结构和算法(第二版)+随书源代码+applet小程序

    《Java数据结构和算法(第二版)》是一本专为希望深入理解Java编程中的数据结构与算法的读者设计的书籍。这本书的特点是从基础知识逐步引导读者进入复杂领域,通过结合实际的Applet小程序,使得理论知识变得生动直观。...

    java 数据结构 算法 第二版 中+英文版

    《Java 数据结构 算法 第二版》是一本深入探讨Java编程中数据结构和算法的权威书籍。这本书分为中文和英文两个版本,为读者提供了双语学习的便利。其中,英文版采用PDF格式,而中文版则为PDG格式。为了确保读者能够...

    Java数据结构和算法中文第二版源码

    《Java数据结构和算法中文第二版源码》是学习Java编程和算法的宝贵资源,它包含了一系列用于理解和实践数据结构和算法的代码示例。在这个压缩包中,有两个主要的子文件:WorkshopApplets.ZIP和ExamplePrograms.ZIP。...

    Java数据结构和算法(第二版).zip

    《Java数据结构和算法》(第2版)介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和...

    Java数据结构和算法.pdf

    * 冒泡排序的思想是假设有 N 个数据需要排序,则从第0 个数开始,依次比较第0 和第 1 个数据,如果第 0 个大于第 1 个则两者交换,否则什么动作都不做,继续比较第1 个第 2个,以此类推,直至所有数据都“冒泡” 到...

    Java数据结构与算法(第二版)

    综上所述,《Java数据结构与算法(第二版)》这本书主要介绍了数据结构和算法的基础知识及其在Java编程语言中的应用。通过对各种数据结构和算法的学习,读者可以更好地理解如何选择合适的数据结构来提高程序效率,并...

    数据结构与算法分析(java语言描述)中文第二版以及习题答案

    书中会深入探讨排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)和查找算法(如线性查找、二分查找、哈希查找等),并分析它们的时间复杂度和空间复杂度,帮助读者评估不同算法在特定场景...

    java数据结构和算法.(第二版)

    《数据结构与算法》以基本数据结构和算法设计策略为知识单元,系统地介绍了数据结构的知识与应用、计算机算法的设计与分析方法,主要内容包括线性表、树、图和广义表、算法设计策略以及查找与排序算法等。《数据结构...

    Java数据结构和算法(第二版)书代码

    《Java数据结构和算法(第二版)》是由Robert编著的一本关于计算机科学核心领域的经典著作,主要关注如何在Java编程环境中实现和应用各种数据结构和算法。这本书的代码库包含了许多实例,可以帮助读者深入理解这些...

    JAVA数据结构与算法-第二版

    总之,《JAVA数据结构与算法-第二版》是一本全面、深入的教程,适合Java程序员、计算机科学学生和对算法有兴趣的读者。通过阅读和实践书中的内容,读者不仅可以提高编程技能,还能培养解决复杂问题的能力,为未来在...

    Java数据结构和算法第二版

    《Java数据结构和算法第二版》是一本深入探讨如何在Java编程环境中应用数据结构和算法的书籍。在软件开发中,理解和熟练运用数据结构与算法是提升程序性能、优化解决方案的关键。下面,我们将详细探讨这些重要的概念...

    java数据结构与算法.pdf

    Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...

    java数据结构和算法(第二版)编程作业答案

    《Java数据结构和算法(第二版)》是一本深入探讨这些主题的重要教材,而编程作业答案则为学习者提供了实践和检验理解的参考。以下是针对该书及编程作业答案中涉及的一些关键知识点的详细解释: 1. **数据结构**: ...

    数据结构冒泡排序算法

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

Global site tag (gtag.js) - Google Analytics