`
BucketLi
  • 浏览: 195058 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

java 的一些排序方法(转)

 
阅读更多
一些java排序方法,记录下。

package com.taobao.junyu.fastnet.util;

import java.util.Arrays;
import java.util.List;

public class SortUtil {
	private static int CUTOFF = 10;

	/**
	 * Simple insertion sort
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void insertionSort(T[] a) {
		insertionSort(a, 0, a.length - 1);
	}

	/**
	 * Simple bubble sort
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void bubbleSort(T[] a) {
		for (int i = 0; i < a.length - 1; i++) // the last one is no need for
												// comparing to itself
		{
			for (int j = a.length - 1; j > i; j--) {
				if (a[j].compareTo(a[j - 1]) < 0) {
					swapReferences(a, j, j - 1);
				}
			}
		}
	}

	/**
	 * Shell sort, using Shell's (poor) increments.
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void shellSort(T[] a) {
		int j;
		for (int gap = a.length / 2; gap > 0; gap /= 2) {
			for (int i = gap; i < a.length; i++) {
				T tmp = a[i];
				for (j = i; j >= gap && tmp.compareTo(a[j - gap]) < 0; j -= gap) {
					a[j] = a[j - gap];
				}
				a[j] = tmp;
			}
		}
	}

	/**
	 * Simple selection sort
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void selectionSort(T[] a) {
		for (int i = 0; i < a.length - 1; i++) {
			int minIdx = i;
			for (int j = i + 1; j < a.length; j++) {
				if (a[j].compareTo(a[minIdx]) < 0)
					minIdx = j;
			}
			if (minIdx != i) {
				swapReferences(a, i, minIdx);
			}
		}
	}

	/**
	 * Standard heap sort
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void heapSort(T[] a) {
		for (int i = a.length / 2; i >= 0; i--) /* buildHeap */
		{
			percDown(a, i, a.length);
		}

		for (int i = a.length - 1; i > 0; i--) {
			swapReferences(a, 0, i); /* deleteMax */
			percDown(a, 0, i);
		}
	}

	/**
	 * Merge sort algorithm
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void mergeSort(T[] a) {
		@SuppressWarnings("unchecked")
		T[] tmpArray = (T[]) new Comparable[a.length];
		mergeSort(a, tmpArray, 0, a.length - 1);
	}

	/**
	 * Quick sort algorithm
	 * 
	 * @param a
	 *            an array of Comparable items
	 */
	public static <T extends Comparable<? super T>> void quickSort(T[] a) {
		quickSort(a, 0, a.length - 1);
	}

	/**
	 * Internal method for heap sort that is used in deleteMax an buildHeap
	 * 
	 * @param a
	 *            an array of Comparable items.
	 * @param i
	 *            the position from which to percolate down.
	 * @param n
	 *            the logical size of binary heap.
	 */
	private static <T extends Comparable<? super T>> void percDown(T[] a,
			int i, int n) {
		int child;
		T tmp;

		for (tmp = a[i]; leftChild(i) < n; i = child) {
			child = leftChild(i);
			if (child != n - 1 && a[child].compareTo(a[child + 1]) < 0)
				child++;
			if (tmp.compareTo(a[child]) < 0)

				a[i] = a[child];
			else
				break;
		}
		a[i] = tmp;
	}

	/**
	 * Internal method for heap sort.
	 * 
	 * @param i
	 *            the index of an item in the heap
	 * @return the index of the left heap
	 */
	private static int leftChild(int i) {
		return 2 * i + 1;
	}

	/**
	 * Internal method that makes recursive calls.
	 * 
	 * @param a
	 *            an array of Comparable items.
	 * @param tmpArray
	 *            an array to place the merged result.
	 * @param left
	 *            the left-most index of the sub-array.
	 * @param right
	 *            the right-most index of the sub-array.
	 */
	private static <T extends Comparable<? super T>> void mergeSort(T[] a,
			T[] tmpArray, int left, int right) {
		if (left < right) {
			int center = (left + right) / 2;
			mergeSort(a, tmpArray, left, center);
			mergeSort(a, tmpArray, center + 1, right);
			merge(a, tmpArray, left, center + 1, right);
		}
	}

	/**
	 * Internal method that merges two sorted halves of a sub-array
	 * 
	 * @param a
	 *            an array of Comparable items
	 * @param tmpArray
	 *            an array to place the merged result.
	 * @param leftPos
	 *            the left-most index of the sub-array.
	 * @param rightPos
	 *            the index of the start of the second half.
	 * @param rightEnd
	 *            the right-most index of the sub-array.
	 */
	private static <T extends Comparable<? super T>> void merge(T[] a,
			T[] tmpArray, int leftPos, int rightPos, int rightEnd) {
		int leftEnd = rightPos - 1;
		int tmpPos = leftPos;
		int numElements = rightEnd - leftPos + 1;

		// Main loop
		while (leftPos <= leftEnd && rightPos <= rightEnd) {
			if (a[leftPos].compareTo(a[rightPos]) <= 0) {
				tmpArray[tmpPos++] = a[leftPos++];
			} else {
				tmpArray[tmpPos++] = a[rightPos++];
			}
		}

		while (leftPos <= leftEnd)
			// Copy rest of first half
			tmpArray[tmpPos++] = a[leftPos++];

		while (rightPos <= rightEnd)
			// Copy rest of second half
			tmpArray[tmpPos++] = a[rightPos++];

		// Copy tmpArray back
		for (int i = 0; i < numElements; i++, rightEnd--) {
			a[rightEnd] = tmpArray[rightEnd];
		}
	}

	/**
	 * Internal quick sort method that makes recursive calls. Uses
	 * median-of-three partitioning and a cutoff of 10
	 * 
	 * @param a
	 *            an array of Comparable items
	 * @param left
	 *            the left-most index of the sub-array.
	 * @param right
	 *            the right-most index of the sub-array.
	 */
	private static <T extends Comparable<? super T>> void quickSort(T[] a,
			int left, int right) {
		if (left + CUTOFF <= right) {
			T pivot = median3(a, left, right);

			// Begin partitioning
			int i = left, j = right - 1;
			for (;;) {
				while (a[++i].compareTo(pivot) < 0) {
				}
				while (a[--j].compareTo(pivot) > 0) {
				}
				if (i < j) {
					swapReferences(a, i, j);
				} else {
					break;
				}
			}

			swapReferences(a, i, right - 1); // Restore pivot

			quickSort(a, left, i - 1); // Sort small elements
			quickSort(a, i + 1, right);// Sort large elements
		} else
		// Do an insertion sort on the sub-array
		{
			insertionSort(a, left, right);
		}
	}

	private static <T extends Comparable<? super T>> T median3(T[] a, int left,
			int right) {
		int center = (left + right) / 2;
		if (a[center].compareTo(a[left]) < 0)
			swapReferences(a, left, center);
		if (a[right].compareTo(a[left]) < 0)
			swapReferences(a, left, right);
		if (a[right].compareTo(a[center]) < 0)
			swapReferences(a, center, right);

		// Place pivot at position right-1
		swapReferences(a, center, right - 1);
		return a[right - 1];
	}

	/**
	 * Internal insertion method
	 * 
	 * @param a
	 *            an array of Comparable items
	 * @param left
	 *            the left-most index of the array
	 * @param right
	 *            the right-most index of the array
	 */
	private static <T extends Comparable<? super T>> void insertionSort(T[] a,
			int left, int right) {
		if (left < right) {
			int j;

			for (int p = left + 1; p <= right; p++) {
				T tmp = a[p];
				for (j = p; j > left && tmp.compareTo(a[j - 1]) < 0; j--)
					a[j] = a[j - 1];
				a[j] = tmp;
			}
		}
	}

	/**
	 * Internal method: Swap the position of two elements of an array by
	 * referencing
	 * 
	 * @param a
	 *            an array for swapping the element
	 * @param i
	 *            the first element's index
	 * @param j
	 *            the second element's index
	 * @return the array after swapping
	 */
	private static <T> T[] swapReferences(T[] a, int i, int j) {
		T tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
		return a;
	}
	
	public static void main(String[] args){
		Integer[] ori=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s1=System.nanoTime();
		SortUtil.bubbleSort(ori);
		System.out.println("bubleSort:"+(System.nanoTime()-s1));
		printArray(Arrays.asList(ori));
		
		Integer[] ori2=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s2=System.nanoTime();
		SortUtil.insertionSort(ori2);
		System.out.println("insertionSort:"+(System.nanoTime()-s2));
		printArray(Arrays.asList(ori2));
		
		Integer[] ori3=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s3=System.nanoTime();
		SortUtil.mergeSort(ori3);
		System.out.println("mergeSort:"+(System.nanoTime()-s3));
		printArray(Arrays.asList(ori3));
		
		Integer[] ori4=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s4=System.nanoTime();
		SortUtil.heapSort(ori4);
		System.out.println("heapSort:"+(System.nanoTime()-s4));
		printArray(Arrays.asList(ori4));
		
		Integer[] ori5=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s5=System.nanoTime();
		SortUtil.quickSort(ori5);
		System.out.println("quickSort:"+(System.nanoTime()-s5));
		printArray(Arrays.asList(ori5));
		
		Integer[] ori6=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s6=System.nanoTime();
		SortUtil.selectionSort(ori6);
		System.out.println("selectionSort:"+(System.nanoTime()-s6));
		printArray(Arrays.asList(ori6));
		
		Integer[] ori7=new Integer[]{32,1,45,63,76,8,3,6,8,9,2,4,56,788,934,5,4,3};
		long s7=System.nanoTime();
		SortUtil.shellSort(ori7);
		System.out.println("shellSort:"+(System.nanoTime()-s7));
		printArray(Arrays.asList(ori7));
	}

	@SuppressWarnings("rawtypes")
	public static void printArray(List array){
		StringBuilder sb=new StringBuilder();
		for(Object o:array){
			sb.append(String.valueOf(o));
			sb.append(" ");
		}
		System.out.println(sb.toString());
	}
}
分享到:
评论

相关推荐

    java 冒泡排序方法

    ### Java冒泡排序方法详解 ...通过对给定代码的分析和优化,我们不仅了解了冒泡排序的基本思想,还掌握了一些改进排序性能的方法。希望这些内容能够帮助你在学习或工作中更好地理解和运用冒泡排序算法。

    JAVA各种排序方法及改良

    本文将深入探讨Java中的各种排序方法以及它们的改良策略。首先,我们来看看几种基础的排序算法,然后讨论如何通过优化来提高这些算法的性能。 1. **冒泡排序**(Bubble Sort): 冒泡排序是最基础的排序算法之一,...

    java冒泡排序java冒泡排序集锦方法!

    以上三个知识点总结了关于 Java 排序的一些基本应用,包括基础的冒泡排序算法、使用标准库 `Collections.sort()` 进行排序以及使用 `RuleBasedCollator` 实现国际化排序等。这些技术对于编写高效、可维护的 Java ...

    java中文排序,数字字母汉字排序

    Java集合框架中的`List`接口提供了一个`sort(Comparator&lt;? super E&gt; comparator)`方法,可以接受一个比较器(Comparator)来定义自定义的排序规则。默认情况下,Java使用自然排序,即按照字符串的Unicode值进行排序...

    java List 排序 Collections.sort

    当我们需要对List中的元素进行排序时,`Collections.sort()`方法就派上了用场。这个方法能够根据元素的自然顺序或者自定义的比较器进行排序。本文将深入探讨`Collections.sort()`的使用、原理以及如何自定义排序规则...

    java冒泡排序,插入排序,堆排序源码(终端输入,可以选择排序方法)

    此外,我们还将讨论如何在Java中使用面向对象的思想来实现这些排序算法,并允许用户通过终端输入选择所需的方法。 首先,让我们来看看冒泡排序。冒泡排序是一种简单的交换排序方法,它通过重复遍历待排序的序列,...

    Java实现几种常见排序方法

    ### Java 实现几种常见排序方法 #### 泡泡排序(Bubble Sort) 泡泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复...

    java 中文姓氏 排序

    Java 提供了多种方式进行排序,包括使用 `Collections.sort()` 方法配合自定义比较器(`Comparator`)。本文将详细介绍如何在 Java 中对包含中文姓氏的对象列表或字符串列表进行排序。 #### 二、基本概念 1. **...

    Java 实现ip 地址排序

    Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序

    java 集合分组与排序

    Java集合框架提供两种主要的排序方式:`Collections.sort()`方法和流API的`sorted()`方法。 - `Collections.sort()`:适用于`List`接口的实现类,如`ArrayList`和`LinkedList`。它直接在原地对列表进行排序,无需...

    java数组排序

    在Java编程语言中,数组排序是一项基础且重要的任务。它涉及到不同的算法,这些...在实际应用中,还可以考虑使用Java的内置排序方法`Arrays.sort()`,它使用了一种高效的快速排序变体,但具体实现细节则由JVM实现决定。

    JAVA 8种排序介绍及实现

    直接插入排序是一种简单的排序方法,它的工作原理类似于我们平时手动整理扑克牌。在排序过程中,我们假设前n-1个元素已经排好序,然后将第n个元素插入到已排序的部分,保持排序不变。这个过程不断重复,直到所有元素...

    java冒泡排序代码

    java冒泡排序代码,亲测能用,控制台输入数据,自动排序

    java基础冒泡排序.ppt

    Java基础知识: 冒泡排序详解,简单而详细的讲清楚了,什么是冒泡排序。 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如...

    java几种排序方法代码

    使用java实现的选择、冒泡、插入、快速、希尔排序以及折半查找

    java排序.txt

    根据提供的文件信息,我们可以归纳出以下关于Java排序的相关知识点: ### 一、文件基本信息 - **文件名**:`java排序.txt` - **文件描述**:该文本文件主要介绍了几种常用的Java排序算法,并通过示例代码展示了...

    Java编程实现中英混合字符串数组按首字母排序的方法

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...

    JAVA冒泡排序和快速排序算法

    在JAVA中,实现这两种排序算法可以使用面向对象的特性,创建一个类如`MaopaoKuaisu.java`,在这个类中定义两个方法,分别实现冒泡排序和快速排序。类的结构可能如下: ```java public class MaopaoKuaisu { public...

Global site tag (gtag.js) - Google Analytics