- 浏览: 466011 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
离开课堂后,排序算法写的比较少了,当有排序的要求时,一般用的比较多的是直接采用Arrays.sort以及Collections.sort结合比较器来实现。
Arrays工具类包含了对各种类型数组的排序,以下是Arrays中包括的sort方法:
以下是Collections中的sort方法,该sort方法中结合了Arrays.sort来实现的。
/** * Sorts the specified list into ascending order, according to the * <i>natural ordering</i> of its elements. All elements in the list must * implement the <tt>Comparable</tt> interface. Furthermore, all elements * in the list must be <i>mutually comparable</i> (that is, * <tt>e1.compareTo(e2)</tt> must not throw a <tt>ClassCastException</tt> * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p> * * This sort is guaranteed to be <i>stable</i>: equal elements will * not be reordered as a result of the sort.<p> * * The specified list must be modifiable, but need not be resizable.<p> * * The sorting algorithm is a modified mergesort (in which the merge is * omitted if the highest element in the low sublist is less than the * lowest element in the high sublist). This algorithm offers guaranteed * n log(n) performance. * * This implementation dumps the specified list into an array, sorts * the array, and iterates over the list resetting each element * from the corresponding position in the array. This avoids the * n<sup>2</sup> log(n) performance that would result from attempting * to sort a linked list in place. * * @param list the list to be sorted. * @throws ClassCastException if the list contains elements that are not * <i>mutually comparable</i> (for example, strings and integers). * @throws UnsupportedOperationException if the specified list's * list-iterator does not support the <tt>set</tt> operation. * @see Comparable */ public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } } /** * Sorts the specified list according to the order induced by the * specified comparator. All elements in the list must be <i>mutually * comparable</i> using the specified comparator (that is, * <tt>c.compare(e1, e2)</tt> must not throw a <tt>ClassCastException</tt> * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p> * * This sort is guaranteed to be <i>stable</i>: equal elements will * not be reordered as a result of the sort.<p> * * The sorting algorithm is a modified mergesort (in which the merge is * omitted if the highest element in the low sublist is less than the * lowest element in the high sublist). This algorithm offers guaranteed * n log(n) performance. * * The specified list must be modifiable, but need not be resizable. * This implementation dumps the specified list into an array, sorts * the array, and iterates over the list resetting each element * from the corresponding position in the array. This avoids the * n<sup>2</sup> log(n) performance that would result from attempting * to sort a linked list in place. * * @param list the list to be sorted. * @param c the comparator to determine the order of the list. A * <tt>null</tt> value indicates that the elements' <i>natural * ordering</i> should be used. * @throws ClassCastException if the list contains elements that are not * <i>mutually comparable</i> using the specified comparator. * @throws UnsupportedOperationException if the specified list's * list-iterator does not support the <tt>set</tt> operation. * @see Comparator */ public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set(a[j]); } }
本文将用JAVA实现七个常用排序,包括:冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序和堆排序。
代码类图如下:
一个抽象类BsseSort中包含了排序用到的一些公共操作,比如比较等。
package my.sort; public abstract class BaseSort<T> { @SuppressWarnings("hiding") protected abstract <T extends Comparable<T>> void sort(T[] array); @SuppressWarnings({ "hiding" }) protected <T extends Comparable<T>> boolean lessThan(T t1, T t2) { return t1.compareTo(t2) < 0; } @SuppressWarnings({ "hiding" }) protected <T extends Comparable<T>> boolean greatThan(T t1, T t2) { return t1.compareTo(t2) > 0; } @SuppressWarnings("hiding") protected <T extends Comparable<T>> boolean equalTo(T t1, T t2) { return t1.compareTo(t2) == 0; } @SuppressWarnings("hiding") protected <T extends Comparable<T>> void swap(T[] array, int i, int j) { T t = array[i]; array[i] = array[j]; array[j] = t; } @SuppressWarnings("hiding") protected <T extends Comparable<T>> void printArray(T[] array) { for (T t : array) { System.out.print(t); System.out.print(" "); } System.out.println(); } }
冒泡排序
package my.sort; public class BubbleSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; for (int i = 0; i < length; i++) { for (int j = 1; j < length - i; j++) { if (greatThan(array[j - 1], array[j])) { swap(array, j - 1, j); } } } } }
插入排序
package my.sort; public class InsertionSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; for (int i = 1; i < length; i++) { for (int j = i; j > 0 && lessThan(array[j], array[j - 1]); j--) { swap(array, j, j - 1); } } } }
选择排序
package my.sort; public class SelectionSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; for (int i = 0; i < length; i++) { int min = i; for (int j = i + 1; j < length; j++) { if (lessThan(array[j], array[min])) { min = j; } } swap(array, i, min); } } }
希尔排序
package my.sort; public class ShellSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; int h = 1; while (h < length / 3) { h = 3 * h + 1; } while (h >= 1) { for (int i = h; i < length; i++) { for (int j = i; j >= h && lessThan(array[j], array[j - h]); j -= h) { swap(array, j, j - h); } } h /= 3; } } }
快速排序
package my.sort; public class QuickSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { sort(array, 0, array.length - 1); } @SuppressWarnings("hiding") private <T extends Comparable<T>> void sort(T[] array, int low, int high) { if (high <= low) return; int j = partition(array, low, high); sort(array, low, j - 1); sort(array, j + 1, high); } @SuppressWarnings("hiding") private <T extends Comparable<T>> int partition(T[] array, int low, int high) { int i = low; int j = high + 1; T v = array[low]; while (true) { while (lessThan(array[++i], v)) { if (i == high) break; } while (lessThan(v, array[--j])) { if (j == low) break; } if (i >= j) break; swap(array, i, j); } swap(array, low, j); return j; } }
归并排序
package my.sort; /** * 自顶向下的归并排序 * * @author Eric * @param <T> */ public class MergeSort<T> extends BaseSort<T> { @SuppressWarnings("unchecked") private Comparable[] aux = null; // 归并所需的辅助数组 @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; aux = new Comparable[length]; doSort(array, 0, length - 1); } @SuppressWarnings("hiding") private <T extends Comparable<T>> void doSort(T[] array, int low, int high) { if (low < high) { // 找出中间索引 int mid = low + (high - low) / 2; // 对左边数组进行递归 doSort(array, low, mid); // 对右边数组进行递归 doSort(array, mid + 1, high); // 合并 doMerge(array, low, mid, high); } } @SuppressWarnings( { "hiding", "unchecked" }) private <T extends Comparable<T>> void doMerge(T[] array, int low, int mid, int high) { // 将array[low...mid]和[mid+1...high]归并 int i = low; int j = mid + 1; /* 将array[low...high]复制到aux[low...high] */ for (int k = low; k <= high; k++) { aux[k] = array[k]; } for (int k = low; k <= high; k++) { if (i > mid) { array[k] = (T) aux[j++]; } else if (j > high) { array[k] = (T) aux[i++]; } else if (lessThan(aux[j], aux[i])) { array[k] = (T) aux[j++]; } else { array[k] = (T) aux[i++]; } } } /* public static void main(String[] args) { String[] array = { "Hello", "World", "Eric", "Allen" }; MergeSort<String> sort = new MergeSort<String>(); sort.printArray(array); sort.sort(array); sort.printArray(array); }*/ }
堆排序
package my.sort; public class HeapSort<T> extends BaseSort<T> { @SuppressWarnings("hiding") @Override protected <T extends Comparable<T>> void sort(T[] array) { int length = array.length; buildHeap(array, length); while (length > 1) { length--; swap(array, 0, length); downHeap(array, length, 0); } } @SuppressWarnings("hiding") private <T extends Comparable<T>> void buildHeap(T[] array, int length) { for (int v = length / 2 - 1; v >= 0; v--) { downHeap(array, length, v); } } @SuppressWarnings("hiding") private <T extends Comparable<T>> void downHeap(T[] array, int length, int v) { int w = 2 * v + 1; while (w < length) { if ((w + 1 < length) && greatThan(array[w + 1], array[w])) { w++; } if (!lessThan(array[v], array[w])) { return; } swap(array, v, w); v = w; w = 2 * v + 1; } } }
测试代码比如:
public static void main(String[] args) { String[] array = { "Hello", "World", "Eric", "Allen" }; HeapSort<String> sort = new HeapSort<String>(); sort.printArray(array); sort.sort(array); sort.printArray(array); }
下面是几个算法的一些比较。
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 900面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6728本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2212本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1739尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2166正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3748本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3173题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7397for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4137本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2899本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
这篇博客“常用排序算法小结(附Java实现)”提供了一种深入理解并掌握常见排序算法的途径,尤其对于Java开发者来说非常实用。文章可能涵盖了如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等多种经典...
### 各种排序算法小结 #### 一、引言 排序算法是在计算机科学中非常基础且常用的一类算法。由于在实际应用中往往需要处理大量数据,因此对排序算法的效率有着较高要求。通常,我们会关注算法的时间复杂度来评估其...
排序算法是计算机科学中基础且重要的概念,它们用于组织和整理数据,使得数据按照特定顺序排列。本篇文章将概述几种常见的排序算法,包括快速排序、归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、...
在高级语言的执行速度上,c是最快的,c++其次,而java和c#是最后的。Java和c#流行,主要的一个原因是可以跨平台。
### 排序算法小结讲解+源码 #### 一、引言 排序算法作为计算机科学中的基础且常用算法,在实际应用中具有重要意义。随着数据量的不断增加,对排序算法的效率提出了更高要求。本文将从简单排序算法出发,逐步过渡到...
六、小结 分治算法是一种有效的算法设计思想,通过将复杂问题分解成小问题,逐步解决,最后合并小问题的解,得到整个问题的解。快速排序算法是基于分治算法的思想,通过将数据分割成独立的两部分,然后递归地对这两...
Java数组常用排序算法实例小结 Java数组常用排序算法是每个Java开发者都需要掌握的基本技能,本文将通过实例形式总结分析Java数组常用的四种排序算法,分别是冒泡排序、数组递增排序、快速排序及选择排序。 一、...
本文将详细讲解四种PHP中常用的排序算法:基本排序(通常指的是选择排序或冒泡排序)、冒泡排序、快速排序以及插入排序。 1. **基本排序**(这里可能是指的选择排序):选择排序是一种简单直观的排序算法,它的工作...
本篇文章将详细解析Java中常见的排序方法,结合"javaeye 收集的java排序小结"资料,旨在帮助读者理解和掌握这些排序算法。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较...
第4章 排序算法 第5章 查找算法 第6章 基本数学问题 第7章 数据结构问题 第8章 数论问题 第9章 算法经典趣题 **0章 游戏中的算法 **1章 密码学概述 **2章 压缩与解压缩算法 第3篇 算法面试篇 **3章 数学能力测试 **4...
4.5.2 Shell排序算法示例 111 4.6 快速排序法 113 4.6.1 快速排序算法 113 4.6.2 快速排序算法示例 114 4.7 堆排序法 116 4.7.1 堆排序算法 116 4.7.2 堆排序算法示例 121 4.8 合并排序法 123 4.8.1 合并...
以下是两种常用的实现方式: 1. **每次随机抽一个数并移动到新数组中**: 这种方法通过while循环,每次随机选择一个数组中的元素添加到新数组,然后从原数组中删除。这种方法保证了所有元素最终都会被选中,但删除...
根据提供的信息,《算法导论》是一本经典的计算机科学教材,...### 小结 以上是针对《算法导论》一书中部分章节的部分习题及其涉及知识点的总结。《算法导论》这本书系统地介绍了算法的设计与分析方法,包括但不限于...
**1.4 本章小结** 本章介绍了研究的背景和意义,以及论文的主要内容和结构,为后续深入探讨C语言中的数据结构、ADT模板库和算法奠定了基础。 **2. 数据结构实现** 在C语言中实现数据结构,需要考虑内存管理、指针...
冒泡排序是一种简单且常用的排序算法。其原理是通过相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。代码实现如下: ```java public class ArrayDemo { public static void main(String[] ...
【华为OD机考小结及算法编程试题解析】 华为OD机考是华为公司针对软件开发和测试岗位的招聘环节,其重要性不言而喻,因为它直接影响候选人的定级和薪资。机考主要包含三道题目,两道简单,一道中等,涵盖50%的软件...
在这个例子中,我们使用冒泡排序算法,通过比较相邻元素并交换位置,最终得到按字典顺序排列的字符串数组。 ```java public class StringTest_1 { // 对字符串数组进行排序 public static void stringSort(String...
在算法部分,排序算法是核心内容,书中详细解析了冒泡排序、选择排序、插入排序、快速排序、归并排序等基础排序算法,以及堆排序和希尔排序等更高效的方法。查找算法方面,书中介绍了顺序查找、二分查找和哈希查找等...