我老老师写的排序算法:
package sort;
import java.util.Comparator;
public class ArrayUtil {
private static final int MERGE_SORT_MIN_SIZE = 7;
/**
* 可用排序方法
*/
public static enum SORT_METHOD {
/**
* 冒泡排序
*/
BUBBLE,
/**
* 快速排序
*/
QUICK,
/**
* 归并排序
*/
MERGE,
/**
* 插入排序
*/
INSERT,
/**
* 选择排序
*/
CHOOSE,
/**
* 希尔排序
*/
SHELL
}
/**
* 排序
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param method
* 排序方法
* @param comparator
* 比较器
*/
public static <T> void sort(T[] array, SORT_METHOD method,
Comparator<? super T> comparator) {
switch (method) {
case BUBBLE:
bubbleSort(array, comparator);
break;
case QUICK:
quickSort(array, comparator, 0, array.length - 1);
break;
case MERGE:
mergeSort(array.clone(), array, 0, array.length, comparator);
break;
case INSERT:
insertSort(array, comparator);
break;
case CHOOSE:
chooseSort(array, comparator);
break;
case SHELL:
shellSort(array, comparator);
break;
}
}
/**
* 冒泡排序实现
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
*/
private static <T> void bubbleSort(T[] array,
Comparator<? super T> comparator) {
for (int i = array.length - 1; i > -1; --i) {
for (int j = 0; j < i; ++j) {
if (comparator.compare(array[j], array[j + 1]) > 0) {
swap(array, j, j + 1);
}
}
}
}
/**
* 快速排序实现
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
* @param low
* 开始
* @param high
* 结束
*/
private static <T> void quickSort(T[] array,
Comparator<? super T> comparator, int low, int high) {
if (low >= high)
return;
int lo = low;
int hi = high + 1;
T elem = array[low];
for (;;) {
while (comparator.compare(array[++lo], elem) < 0 && lo < high)
;
while (comparator.compare(array[--hi], elem) > 0 && hi > low)
;
if (lo < hi)
swap(array, lo, hi);
else
break;
}
swap(array, low, hi);
quickSort(array, comparator, low, hi - 1);
quickSort(array, comparator, hi + 1, high);
}
/**
* 归并排序
*
* @param <T>
* 数组元素类型
* @param src
* 源数组
* @param dest
* 目标数组
* @param low
* 开始
* @param high
* 结束
* @param c
* 比较器
*/
private static <T> void mergeSort(T[] src, T[] dest, int low, int high,
Comparator<? super T> c) {
int length = high - low;
if (length < MERGE_SORT_MIN_SIZE) {
for (int i = low; i < high; i++)
for (int j = i; j > low && c.compare(dest[j - 1], dest[j]) > 0; j--)
swap(dest, j, j - 1);
return;
}
int destLow = low;
int destHigh = high;
int mid = (low + high) >>> 1;
mergeSort(dest, src, low, mid, c);
mergeSort(dest, src, mid, high, c);
if (c.compare(src[mid - 1], src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
/**
* 插入排序实现
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
*/
private static <T> void insertSort(T[] array,
Comparator<? super T> comparator) {
for (int i = 1; i < array.length; i++) {
for (int j = i; (j > 0)
&& (comparator.compare(array[j], array[j - 1]) < 0); j--) {
swap(array, j, j - 1);
}
}
}
/**
* 选择排序
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
*/
private static <T> void chooseSort(T[] data,
Comparator<? super T> comparator) {
for (int i = 0; i < data.length; i++) {
int lowIndex = i;
for (int j = data.length - 1; j > i; j--) {
if (comparator.compare(data[j], data[lowIndex]) < 0) {
lowIndex = j;
}
}
swap(data, i, lowIndex);
}
}
/**
* 希尔排序
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
*/
private static <T> void shellSort(T[] data, Comparator<? super T> comparator) {
for (int i = data.length / 2; i > 2; i /= 2) {
for (int j = 0; j < i; j++) {
shellInsertSort(data, comparator, j, i);
}
}
shellInsertSort(data, comparator, 0, 1);
}
/**
* 希尔排序的增量排序
*
* @param <T>
* 数组元素类型
* @param array
* 被排序数组
* @param comparator
* 比较器
* @param start
* 开始位置
* @param inc
* 步长
*/
private static <T> void shellInsertSort(T[] data,
Comparator<? super T> comparator, int start, int inc) {
for (int i = start + inc; i < data.length; i += inc) {
for (int j = i; (j >= inc)
&& (comparator.compare(data[j], data[j - inc]) < 0); j -= inc) {
swap(data, j, j - inc);
}
}
}
/**
* 交换两个元素的位置
*
* @param <T>
* 元素
* @param array
* 数组
* @param i
* 位置1
* @param j
* 位置2
*/
private static <T> void swap(T[] array, int i, int j) {
T t = array[i];
array[i] = array[j];
array[j] = t;
}
}
分享到:
相关推荐
本文将详细介绍Java中常见的几种排序算法,包括冒泡排序、快速排序以及选择排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它的主要思想是通过不断比较相邻元素并交换位置,使得较大的元素逐渐“浮”到...
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
本文将深入探讨在Java中实现的几种常见排序算法:冒泡排序、快速排序以及堆排序。 1. **冒泡排序(Bubble Sort)** 冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较相邻元素并交换位置,直到没有任何一对...
本文将深入探讨Java中常见的几种排序算法,包括它们的工作原理、优缺点以及如何在实际编程中应用。 首先,我们来看`BubbleSortAlgorithm.java`,它实现的是冒泡排序。冒泡排序是一种简单的交换排序,通过重复遍历...
Java几种常见的排序算法
7. **计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort)**:这三种排序算法属于非比较型排序,不依赖于元素间的比较,而是基于特定的特性,如元素的范围、分布等。Java中实现这类排序通常...
直接插入排序是一种基础且简单的排序算法,它的工作原理类似于我们日常生活中的整理扑克牌。在Java中实现这个算法,我们可以从以下几个关键知识点入手: 1. **基本思想**:直接插入排序是通过构建有序序列,对于未...
以下是对Java中几种常见排序算法的详细解析: 1. 冒泡排序: 冒泡排序是一种简单直观的排序算法,通过不断交换相邻的不正确顺序元素来达到排序的目的。它的时间复杂度为O(n^2),在处理大量数据时效率较低。尽管效率...
除了以上介绍的四种排序算法外,Java中还有以下几种常用的排序算法: 1. **冒泡排序**:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。遍历所有元素之后,最大的元素就会被放到最后的位置上。然后...
JAVA几种常用的经典的排序算法 冒泡 选择 快速 shell 堆排序
根据提供的文件信息,我们可以总结出该文档主要涉及了五种基于...以上就是关于这五种排序算法的介绍及其基于Java的实现方式。这些排序算法各有优缺点,适用于不同的场景,了解并掌握它们能够帮助开发者更好地解决问题。
根据提供的文件信息,本文将详细介绍如何使用Java语言来实现几种常见的排序算法,包括插入排序(Insert Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及希尔排序(Shell Sort)。这些排序算法在...
根据给定的信息,本文将详细介绍Java中的四种基本排序算法:冒泡排序、插入排序、快速排序和选择排序。...以上四种排序算法各有优缺点,适用场景也不同。在实际应用中,根据具体需求选择合适的排序算法是非常重要的。
下面我们将详细探讨Java中常见的几种排序算法。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换位置,将最大或最小的元素逐渐“冒泡”到数组的一端。虽然效率较低,但其...
总结而言,上述四种排序算法各有优缺点,适用于不同的场景。插入排序和冒泡排序在处理小规模数据时较为有效;选择排序在某些特定情况下有优势;而希尔排序则在处理大规模数据集时表现更为优秀。理解和掌握这些排序...
### Java 实现数据结构常见排序算法及详解 #### 排序算法概述 排序算法是计算机科学中的基础概念之一,主要用于将一系列数据按照特定规则进行排列。根据数据处理方式的不同,排序算法大致分为两大类:比较排序与非...
堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆排序可以分为大顶堆和小顶堆两种类型。堆排序的主要步骤包括建立初始堆、调整堆以及重建堆。 **时间复杂度**: - 最好情况:O(n log n); - 平均情况:O(n ...
本文将详细介绍几种常见的排序算法的实现方式及其性能分析,包括插入排序、折半插入排序、希尔排序、选择排序和堆排序。 1. **插入排序(Insertion Sort)**: 插入排序是一种简单直观的排序算法。它的基本思想是...
这个文件"JAVA关于几种排序算法的性能比较.pdf"显然探讨了不同排序算法在Java环境下的效率对比,包括直接插入排序、直接选择排序、冒泡排序、希尔排序、快速排序和堆排序。这些排序算法各有优劣,适用于不同的场景,...