java数组的排序对于short,int和long型,采用不同的排序策略。int和long采用快速排序,而short采用计数排序。
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
计数排序利用的是数组的随机访问特性,将要排序的数k转换成数组的下标K,该数组中以k为下标的值A[k]代表这个数K的个数。这种排序非常快,但应用条件比较苛刻。
主要受需要排序的序列规模(n),序列最大值(max(n))影响,如果max(n)过大,算法空间复杂度比较高,也是该算法的一个制约因素。
先看看计数排序的定义
Counting sort (sometimes referred to as ultra sort or math sort[1]) is a sorting algorithm which (like bucket sort) takes advantage of knowing the range of the numbers in the array to be sorted (array A). It uses this range to create an array C of this length. Each index i in array C is then used to count how many elements in A have the value i; then counts stored in C can then be used to put the elements in A into their right position in the resulting sorted array. The algorithm was created by Harold H. Seward in 1954.
计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现个数。这个算法于1954年由 Harold H. Seward 提出。
下面以示例来说明这个算法
假设要排序的数组为 A = {1,0,3,1,0,1,1}
这里最大值为3,最小值为0,那么我们创建一个数组C,长度为4.
然后一趟扫描数组A,得到A中各个元素的总数,并保持到数组C的对应单元中。
比如0 的出现次数为2次,则 C[0] = 2;1 的出现次数为4次,则C[1] = 4
由于C 是以A的元素为下标的,所以这样一做,A中的元素在C中自然就成为有序的了,这里我们可以知道 顺序为 0,1,3 (2 的计数为0)
然后我们把这个在C中的记录按每个元素的计数展开到输出数组B中,排序就完成了。
也就是 B[0] 到 B[1] 为0 B[2] 到 B[5] 为1 这样依此类推。
这种排序算法,依靠一个辅助数组来实现,不基于比较,算法复杂度为 O(n) ,但由于要一个辅助数组C,所以空间复杂度要大一些,由于计算机的内存有限,这种算法不适合范围很大的数的排序。注:基于比较的排序算法的最佳平均时间复杂度为 O(nlogn)
这是JDK源码中的arrays.java, count是辅助排序的数组,具体的算法解释。见中文注释。
/** * Sorts the specified range of the array using the given * workspace array slice if possible for merging * * @param a the array to be sorted * @param left the index of the first element, inclusive, to be sorted * @param right the index of the last element, inclusive, to be sorted * @param work a workspace array (slice) * @param workBase origin of usable space in work array * @param workLen usable size of work array */ static void sort(short[] a, int left, int right, short[] work, int workBase, int workLen) { // Use counting sort on large arrays if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { //COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200 int[] count = new int[NUM_SHORT_VALUES]; //NUM_SHORT_VALUES=1 << 16 for (int i = left - 1; ++i <= right; count[a[i] - Short.MIN_VALUE]++ ); //计算排序数组中,每一个元素出现的次数 for (int i = NUM_SHORT_VALUES, k = right + 1; k > left; ) { while (count[--i] == 0); //数组上部清零 short value = (short) (i + Short.MIN_VALUE); int s = count[i]; do { a[--k] = value; //对数组a[]进行排序 } while (--s > 0); } } else { // Use Dual-Pivot Quicksort on small arrays doSort(a, left, right, work, workBase, workLen); } }
相关推荐
java中数组的自定义排序,种类繁多,简单实现,可自由操控。
在本篇文章中,我们将深入探讨Java中实现数组递增排序的方法,以及相关的编程知识点。 首先,最常见的数组排序算法是冒泡排序(Bubble Sort)、选择排序(Selection Sort)、插入排序(Insertion Sort)和快速排序...
JAVA\数组排序,JAVA语言实现随机数的输入以及数组的排序。JAVA 随机数 数组排序
4. **二分查找**:二分查找法适用于已排序的数组,通过不断缩小搜索范围快速找到目标元素。 5. **下标类型**:Java中数组的下标是整型(`int`),不能是其他数据类型。 6. **下标范围**:数组的最小下标是0,最大...
Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...
### Java数组与内存控制 #### 一、Java数组在内存分配方面的知识 ##### 1.1 数组初始化 - **声明数组的时候如何分配内存:** - 在Java中,数组的声明并不直接分配内存,而仅仅是创建了一个数组引用变量。例如: ...
在Java编程中,"Java数组版ATM"项目是一个典型的面向对象设计实例,它通过数组来模拟自动取款机(ATM)的功能。这个项目旨在教授如何利用Java语言中的类、对象、数组以及相关的面向对象设计原则来实现一个简单的银行...
在Java编程中,文件读取、数组操作、选择排序以及二分查找是常见的编程任务,它们涉及了IO流、数据结构和算法等多个方面。以下是这些知识点的详细解释: 1. **文件读取**:Java提供了丰富的IO流类库用于读取文件。...
46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip...
43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip43.java数组定义1.zip...
22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组的复制.zip22.java数组...
20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间分配.zip20.java数组空间...
45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip...
44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip...
### JAVA数组的排序方法实例 #### 内容概述: 本文档详细介绍了两种在Java中对数组进行排序的方法:冒泡排序法与使用`Arrays.sort()`方法实现数组递增排序。这两种方法是Java编程中常见的排序手段,对于理解数组...
JAVA代码实现:用冒泡法将数组进行排序显示,并将删除重复项之后的新数组进行输出
java实现数组从小到大排序,输出为数组。可以直接拿来用,注释清楚,可读性强,适用于基础练习,课堂作业等
Java数组教案 Java数组是Java编程语言中的一种重要数据结构,用于存储和处理一组数据。在本教案中,我们将详细介绍Java数组的声明、表示、赋值和内存分配,帮助学生掌握数组的基本概念和应用。 一、数组的声明和...
6. **数组操作方法**:Java的`Arrays`类提供了一些实用方法,如排序(`sort()`)、复制(`copyOf()`)和填充(`fill()`)等。 Java环境配置是安装和设置Java开发环境的过程,包括以下几个关键步骤: 1. **下载JDK**:...