`
Scliu123
  • 浏览: 41352 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JDK_实例(排序类)

阅读更多

排序接口

 

package book.oo.sort;
/**
 * 定义数字排序的接口
 */
public interface ISortNumber {
	/**
	 * 对整型数组按升序排序
	 * @param intArray	待排序的整型数组
	 * @return	按升序排序后的数组
	 */
	public int[] sortASC(int[] intArray);
}

 

 

冒泡法

 

package book.oo.sort.impl;

import book.oo.sort.ISortNumber;
/**
 * 采用冒泡法对整型数组排序
 */
public class BubbleSort implements ISortNumber {

	public BubbleSort() {
	}

	/**
	 * 冒泡排序法
	 */
	public int[] sortASC(int[] intArray) {
		if (intArray == null){
			return null;
		}
		//因为Java的参数传递是采用引用传值方式,因为在排序的过程中,需要对改变数组,
		//所以,为了保证输入参数的值不变,这里采用了数组的clone方法,直接克隆一个数组。
		int[] srcDatas = (int[]) intArray.clone();
		boolean changedPosition = true;
		int comparedTimes = 0;
		int maxComparedTimes = srcDatas.length - 1;

		while ((comparedTimes < maxComparedTimes) && (changedPosition)) {
			for (int i = 0; i < (maxComparedTimes - comparedTimes); i++) {
				changedPosition = false;
				if (srcDatas[i] > srcDatas[i + 1]) {
					swap(srcDatas, i, i + 1);
					changedPosition = true;
				}
			}
			comparedTimes++;
		}

		return srcDatas;
	}

	/**
	 * 交换数组中下标为src和dest的值
	 * @param data	数组
	 * @param src	源下标
	 * @param dest  目标下标
	 */
	private void swap(int[] data, int src, int dest) {
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}
}

 

 

线性插入排序法

 

package book.oo.sort.impl;

import book.oo.sort.ISortNumber;
/**
 * 采用线性插入排序法实现数组的排序
 */
public class LinearInsertSort implements ISortNumber {
	public LinearInsertSort(){
	}
	/**
	 * 线性插入法
	 */
	public int[] sortASC(int[] intArray) {
		if (intArray == null){
			return null;
		}
		int[] srcDatas = (int[]) intArray.clone();
        int size = srcDatas.length;
        int temp = 0;
        int index = 0;
        //假定第一个数字是已经排好了序列,所以i是从1开始而不是从0开始。
        for (int i=1; i<size; i++){
            temp = srcDatas[i];
            index = i;
            while ((index > 0) && (temp < srcDatas[index-1])){
                //移动index后面的数字
                srcDatas[index] = srcDatas[index-1];
                index--;
            }
            srcDatas[index] = temp;
        }
        return srcDatas;
	}
}

 

 

快速排序法

 

package book.oo.sort.impl;

import book.oo.sort.ISortNumber;
/**
 * 采用快速排序法实现数组的排序
 */
public class QuickSort implements ISortNumber {

	public QuickSort(){
	}
	/**
	 * 快速排序法
	 */
	public int[] sortASC(int[] intArray) {
		if (intArray == null){
			return null;
		}
		int[] srcDatas = (int[]) intArray.clone();
		return this.quickSort(srcDatas, 0, srcDatas.length - 1);
	}
	/**
	 * 采用分治递归的方法实现快速排序法
	 * @param srcDatas	待排序的数组
	 * @param first		起始下标
	 * @param last		终止下标
	 * @return
	 */
	private int[] quickSort(int[] srcDatas, int first, int last) {
		if (first < last) {
			int pos = partition(srcDatas, first, last);
			quickSort(srcDatas, first, pos - 1);
			quickSort(srcDatas, pos + 1, last);
		}
		return srcDatas;
	}
	/**
	 * 寻找数组的分治点,
	 * 根据数组的第一个数分治,把比数组第一个数大的往后排,把比数组第一个数小的往前排
	 * @param srcDatas
	 * @param first
	 * @param last
	 * @return	传入数组的第一个数的最终下标
	 */
	private int partition(int[] srcDatas, int first, int last) {
		int temp = srcDatas[first];
		int pos = first;
		for (int i = first + 1; i <= last; i++) {
			if (srcDatas[i] < temp) {
				pos++;
				swap(srcDatas, pos, i);
			}
		}
		swap(srcDatas, first, pos);
		return pos;
	}
	/**	交换数组中下标为src和dest的值*/
	private void swap(int[] data, int src, int dest) {
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}
}

 

 

选择排序法

 

package book.oo.sort.impl;

import book.oo.sort.ISortNumber;

/**
 * 使用选择排序法对整型数组进行排序
 */
public class SelectionSort implements ISortNumber {
	public SelectionSort(){
	}
	/**
	 * 选择排序法
	 */
	public int[] sortASC(int[] intArray) {
		if (intArray == null){
			return null;
		}
		//因为Java的参数传递是采用引用传值方式,因为在排序的过程中,需要对改变数组,
		//所以,为了保证输入参数的值不变,这里采用了数组的clone方法,直接克隆一个数组。
		int[] srcDatas = (int[]) intArray.clone();
		int size = srcDatas.length;
		for (int i = 0; i < size; i++) {
			for (int j = i; j < size; j++) {
				if (srcDatas[i] > srcDatas[j]) {
					swap(srcDatas, i, j);
				}
			}
		}
		return srcDatas;
	}
	/**
	 * 交换数组中下标为src和dest的值
	 * @param data	数组
	 * @param src	源下标
	 * @param dest  目标下标
	 */
	private void swap(int[] data, int src, int dest) {
		int temp = data[src];
		data[src] = data[dest];
		data[dest] = temp;
	}

}

 

 

测试类

package book.oo.sort;

import book.oo.sort.impl.BinaryInsertSort;
import book.oo.sort.impl.BubbleSort;
import book.oo.sort.impl.LinearInsertSort;
import book.oo.sort.impl.QuickSort;
import book.oo.sort.impl.SelectionSort;

public class SortTest {
	
	/**
	 * 打印数组
	 * @param intArray  待打印的数组
	 */
	public static void printIntArray(int[] intArray){
		if (intArray == null){
			return;
		}
		for (int i=0; i<intArray.length; i++){
			System.out.print(intArray[i] + " ");
		}
		System.out.println();
	}
	public static void main(String[] args){
		int[] intArray = new int[]{6,3,4,2,7,2,-3,3};
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		ISortNumber test = new SelectionSort();
		System.out.print("选择排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new BubbleSort();
		System.out.print("冒泡排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new LinearInsertSort();
		System.out.print("线性插入排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new BinaryInsertSort();
		System.out.print("二分插入排序法排序结果:");
		printIntArray(test.sortASC(intArray));
		
		System.out.print("排序前的数组:");
		printIntArray(intArray);
		test = new QuickSort();
		System.out.print("快速排序法排序结果:");
		printIntArray(test.sortASC(intArray));
	}
//	排序前的数组:6 3 4 2 7 2 -3 3 
//	选择排序法排序结果:-3 2 2 3 3 4 6 7 
//	排序前的数组:6 3 4 2 7 2 -3 3 
//	冒泡排序法排序结果:2 2 -3 3 3 4 6 7 
//	排序前的数组:6 3 4 2 7 2 -3 3 
//	线性插入排序法排序结果:-3 2 2 3 3 4 6 7 
//	排序前的数组:6 3 4 2 7 2 -3 3 
//	二分插入排序法排序结果:-3 2 2 3 3 4 6 7 
//	排序前的数组:6 3 4 2 7 2 -3 3 
//	快速排序法排序结果:-3 2 2 3 3 4 6 7 
}

 

分享到:
评论

相关推荐

    java_JDK_实例开发宝典

    Java JDK实例开发宝典是一本专注于Java编程实践的书籍,旨在通过丰富的实例帮助开发者深入理解和应用Java语言。在深入探讨Java JDK(Java Development Kit)的过程中,本书覆盖了多个关键知识点,包括基础语法、面向...

    JDK_API_1.7

    `Arrays`类提供了并行版本的排序和处理方法,利用多核CPU提升执行效率。 以上就是JDK API 1.7的一些核心特性,了解并熟练运用这些功能,能显著提升Java开发的效率和代码质量。Java API文档是学习和查找这些特性的...

    jdk_8.0.1310.11_64.zip

    Lambda表达式可以替代那些具有单个抽象方法的接口的匿名类实例,通常用于处理集合或事件驱动的编程。 2. **函数式接口**:为支持Lambda表达式,Java 8引入了`@FunctionalInterface`注解,用于标识只含有一个抽象...

    JDK_API_1_6_zh_CN.zip_6_API_jdk

    1. **增强的Swing UI组件**:JDK 6对Swing用户界面库进行了大量优化,增加了新的组件和功能,如JTable的行排序和过滤,以及更强大的JTabbedPane。 2. **动态代理**:Java 6引入了`java.lang.reflect.Proxy`类,允许...

    JDK_API_1.8_google.rar

    例如,使用`java.util.concurrent.Callable`接口时,可以直接引用一个方法,而不用创建整个匿名类实例。 三、默认方法 接口在JDK 1.8中新增了默认方法的特性,允许接口中定义带有实现的方法,这样可以在不破坏向后...

    JDK_API_1_6

    - `Constructor类`: 代表类的构造器,用于动态实例化对象。 8. **国际化** - `ResourceBundle类`: 提供本地化资源管理,支持不同语言环境下的字符串和其他资源。 - `Locale类`: 表示特定的地理、文化和社会习惯...

    JDK_8_API帮助文件(英文原版)

    9. **双括号初始化**:这是一种语法糖,可以快速创建匿名内部类实例,常用于创建集合或自定义对象。 10. **重复注解**:JDK 8允许在同一元素上重复应用相同类型的注解,增强了注解的灵活性。 通过这份JDK 8 API...

    jdk1.8.0_144 (Java SE Development Kit 8u144)

    构造器引用则可以直接创建类的新实例。 3. **流(Stream)**:Java 8引入了流API,使得处理集合数据变得更加高效和简洁。流可以进行过滤、映射、排序等操作,支持并行处理,从而提高程序性能。 4. **默认方法**:在...

    jdk_ri-7u75-b13-windows-i586-18_dec_2014.zip

    1. **多路归并排序**:在Java 7中,`java.util.Arrays.sort()`方法进行了优化,采用了多路归并排序算法,提高了排序性能,尤其对于大数据量的数组,效果显著。 2. **字符串inswitch**:新增了`switch`语句对字符串...

    JDK1.7.0_49

    2. **多路归并排序**:在Java 7中,`Arrays.sort()` 方法使用了多路归并排序算法,提高了排序性能,尤其是处理大数据量时。 3. **字符串连接优化**:Java 7对字符串连接操作进行了优化,使用StringBuilder时,如果...

    jdk1.7.0_51.zip

    9. **改进的集合框架**:添加了`Objects`类,提供了实用的静态方法,如`equals()`、`hashCode()`和`requireNonNull()`,还有`Collections`的`copy()`和`replaceAll()`方法的增强。 10. **并发改进**:`Fork/Join`...

    Java JDK 7 实例宝典代码

    - `Arrays`类提供了`copyOf()`和`copyOfRange()`方法的变体,允许复制已排序的数组到一个新的排序数组。 4. **异常处理**: - 多异常捕获:可以使用`catch`块同时捕获多种类型的异常,使用`|`分隔不同类型的异常...

    jdk1.8.0_45_64bit.zip

    例如,`Arrays.sort(list, Comparator.comparing(Person::getAge))` 就是一个方法引用的例子,它使用了`Person`类的`getAge`方法来排序一个`Person`对象列表。 再者,Java 8新增了日期和时间API(java.time包),...

    jdk1.8.0_91.rar

    JDK 1.8还引入了Optional类,用来表示可能为null的对象引用。Optional对象可以避免空指针异常,通过强制程序员显式处理null情况,提高了代码的健壮性。它通过API提供了检查是否包含值、获取值、转换值等多种方法,让...

    JDK_API1.7

    - **钻石运算符**:在创建带泛型的匿名类实例时,编译器可以自动推断类型,如`new ArrayList()`。 - **二进制字面量**:可以直接使用二进制前缀`0b`来表示二进制数字,如`0b1010`。 - **多路归约**:`Stream` API中...

    jdk1.7.0_80_32bit.zip

    7. **并行数组操作**:Arrays类增加了新的并行流和并行排序方法,使得大规模数据处理更加高效。 8. **改进的垃圾收集器**:JDK7对垃圾收集器进行了优化,例如G1(Garbage First)垃圾收集器,旨在提供更稳定的暂停...

    解压版OpenJDK8_x64_Win_jdk8u172-b11.zip

    9. **并行数组操作**:Arrays类增加了新的并行处理方法,如parallelSort(),可以在多核处理器上进行高效的排序。 10. **类型推断**:Java 8的编译器增强了类型推断能力,使得在某些情况下,类型可以由编译器自动...

    java JDK 实例开发宝典

    Java JDK实例开发宝典是一本专注于Java开发实践的书籍,主要涵盖了JDK中的核心特性和常见工具的使用方法。在本书中,读者可以找到一系列精心设计的实例,旨在帮助开发者深入理解和熟练应用Java语言。以下是对书中...

    OpenJDK8U-jdk-x64-windows-hotspot-8u352b08-3.zip

    这些方法在接口中用default关键字声明,可以在不实现该接口的类的实例上调用。 新的日期时间API(java.time包)取代了旧的java.util.Date和java.util.Calendar,提供了更直观、线程安全的日期和时间处理。这个API...

    通过分析_JDK_源代码研究_TreeMap_红黑树算法实现.docx

    ### 通过分析JDK源代码研究TreeMap红黑树算法实现 #### 一、TreeMap与TreeSet的关系 TreeMap 和 TreeSet 是 Java 集合框架中的重要成员,它们提供了基于红黑树的数据结构实现。从给定部分源代码可以看到,TreeSet ...

Global site tag (gtag.js) - Google Analytics