`
musicbox95351
  • 浏览: 229426 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Arrays.sort算法

 
阅读更多
Arrays.sort(int[] i) 的算法总体思路
如果元素小于7个使用一般排序
  否则使用快速排序。在快速排序中递归调用Arrays.sort(int[] i) 方法。


其中一般排序的思路:
采用双循环。
每次外层循环(第N次)处理完后都保证从左到右(第1到N个)已经排好序,
内层循环处理时只处理第1到第N个元素)
    如果发现最右侧的元素比它的左邻居还要大即可直接跳出内层循环。
    否则将从左向右逐个和最右侧的元素比对,发现有元素比最右侧的元素大就对换。
引用
	if (len < 7) {
	    for (int i=off; i<len+off; i++)
		for (int j=i; j>off && x[j-1]>x[j]; j--)
		    swap(x, j, j-1);
	    return;
	}

比如[3,2,1,5,0]的排序过程
首先对[3,2]排序
[2,3,1,5,0]
对[2,3,1]排序
[1,3,2,5,0]
[1,2,3,5,0]下一步会对[1,2,3,5]进行排序
此时发现 5比3大则直接跳出内层循环。下一步会对[1,2,3,5,0]排序
[0,2,3,5,1]
[0,1,3,5,2]
[0,1,2,5,3]
[0,1,2,3,5]


快速排序的思路其实不难,但是看其实现的代码看了老半天。

快速排序思路:
在数组中找一个中间值元素(Arrays.sort方法在找中间值的处理上也考虑的比较多),最好是整个序列中值不大不小的那个元素。
然后让中间值元素左边的都比它小,中间值元素右边的都比它大,相等的元素放到中间值旁边。
这样处理一次后就可以保证左边的序列都是较小的,右边的序列都是较大的。
然后分别对左边和后边的序列进行递归处理。

Arrays.sort方法找中间值
如果序列长度大于7小于41则从首、尾、中间三个元素中挑一个中间值
如果序列长度大于40个,则将序列大致分三段,每一段按上面的方法各取一个中间值,然后在这三个中间值中取一次中间值。
引用
	// Choose a partition element, v
	int m = off + (len >> 1);       // Small arrays, middle element
	if (len > 7) {
	    int l = off;
	    int n = off + len - 1;
	    if (len > 40) {        // Big arrays, pseudomedian of 9
		int s = len/8;
		l = med3(x, l,     l+s, l+2*s);
		m = med3(x, m-s,   m,   m+s);
		n = med3(x, n-2*s, n-s, n);
	    }
	    m = med3(x, l, m, n); // Mid-size, med of 3
	}
	int v = x[m];



Arrays.sort方法中快速排序部分的元素移动:
就像两只部队从序列两端分别向中间移动。
  首先从左向右移动
    如果遇到和中间值相等的元素则将其尽可能向左排,
    如果遇到小于中间值的元素则继续向右查找,如果和从右向左的部队会师就停下来。
    如果遇到大于中间值的元素则记下该元素假设为X,然后等待从右向左的运行结果。
  从右向左移动
    如果遇到和中间值相等的元素则将其尽可能向右排,
    如果遇到大于中间值的元素则继续向左查找,如果和从左向右的部队会师就停下来。
    如果遇到小于中间值的元素则记下该元素假设为Y。
  如果两个方向的部队没有会师,交换X,Y元素,然后两支部队按照上面逻辑继续相向运动。
  如果已经会师则将左右两端和中间值相等的元素放到序列的中间。
现在就已经完成了一轮次的快速排序了。剩下的就是对中间值左右两边的两个序列分别做同样的动作(递归)。
引用

// Establish Invariant: v* (<v)* (>v)* v*
	int a = off, b = a, c = off + len - 1, d = c;
	//找到左边第一个比中间值大的,右边第一个比中间值小的,两个对换
	while(true) {
	    while (b <= c && x[b] <= v) {
		if (x[b] == v)
		    swap(x, a++, b);
		b++;
	    }
	    while (c >= b && x[c] >= v) {
		if (x[c] == v)
		    swap(x, c, d--);
		c--;
	    }
	    if (b > c)
		break;
	    swap(x, b++, c--);
	}

	// Swap partition elements back to middle
	int s, n = off + len;
	s = Math.min(a-off, b-a  );  vecswap(x, off, b-s, s);//将左边的和中间值相等的元素移到序列中间
	s = Math.min(d-c,   n-d-1);  vecswap(x, b,   n-s, s);//将右边的和中间值相等的元素移到序列中间

	// Recursively sort non-partition-elements
	if ((s = b-a) > 1)
	    sort1(x, off, s);
	if ((s = d-c) > 1)
	    sort1(x, n-s, s);

分享到:
评论

相关推荐

    Java Arrays.sort和Collections.sort排序实现原理解析

    总的来说,`Arrays.sort()`和`Collections.sort()`的实现都依赖于TimSort,这是一种高效的、稳定且适应性强的排序算法,能够很好地处理各种数据输入情况。了解其内部工作原理,可以帮助开发者更好地理解和优化自己的...

    深入理解java中Arrays.sort()的用法

    DualPivotQuicksort.sort()方法是一个高效的排序算法,它可以对数组进行快速排序。 Arrays.sort()是一个非常有用的方法,它可以对数组进行排序。但是,需要注意的是,它的参数类型有很多种,需要根据实际情况选择...

    java中的arrays.sort()代码详解

    Arrays.sort()是Java中的一种排序算法,该方法可以对数组进行排序,具体来说,它可以对基本类型数组和对象数组进行排序。在本文中,我们将详细介绍Arrays.sort()的使用方法,包括简单示例、策略模式和“super”的...

    java的Arrays类的应用.doc

    - `Arrays.binarySearch()`方法实现了二分查找算法,用于在已经排序的数组中查找特定元素。如果找到,返回元素的索引;否则,返回一个负数,该负数的绝对值表示插入元素的位置。例如,`Arrays.binarySearch(array1,...

    Java sort算法学习

    1. **快速排序**:这是`Arrays.sort()`默认使用的排序算法,对于小数组(长度小于7),它采用插入排序。对于大数组,它使用分治法,将数组分为两部分,选择一个基准值,使得基准值左边的元素都小于基准,右边的元素...

    Java5.0数组排序

    同时,`Arrays.sort()`方法在稳定性和性能上也有所提升,保证了相同元素的相对顺序不会因为排序而改变,即排序算法是稳定的。 总结,Java 5.0对数组排序的改进使得开发者在处理数据排序时有了更多的选择和便利,...

    java sort排序算法实例完整代码

    Java中的`sort`排序算法是Java集合框架的重要组成部分,主要用于对List接口的实现类进行排序。这个算法在Java中主要体现在`java.util.Arrays`和`java.util.Collections`两个类中,提供了对数组和集合的排序功能。...

    Java容易被忽视的API

    2. `Arrays.sort(T[], int, int, Comparator)` 和 `Arrays.sort(T[], Comparator)` 适用于泛型数组,其中 `Comparator` 参数可以自定义比较规则。 3. `Collections.sort(List)` 和 `Collections.sort(List, ...

    排序算法的学习demo sortes.zip

    Java的`java.util.Arrays`类提供了多种内置排序方法,如`Arrays.sort()`,可以对整数、浮点数、字符数组,以及实现了`Comparable`接口或提供了自定义`Comparator`的对象数组进行排序。但是,学习和实现排序算法有助...

    Java 程序对数组元素进行降序排序

    从 Java 14 开始,Arrays.sort(int[]) 使用introsort 算法,时间复杂度为 O(N log N)。 对数组元素进行降序排序可以通过使用 Collections.reverseOrder() 方法或排序和反转来实现。不同的方法具有不同的时间复杂度...

    JAVA通过数组按首字母排序

    本篇文章将详细介绍如何利用Java内置的`Arrays.sort()`方法按照字符串的首字母进行排序,以及如何处理大小写敏感性问题。 #### 一、基础知识简介 在开始之前,我们先了解几个基本概念: - **字符串数组**:一个由...

    leetcode分类-algorithm:基本算法归集,主要来源于CLRS《算法导论》,*Algo.java主要对应各个算法的实现,*Test

    通用测试类,支持多种数据类型,支持2份相同数组的排序比较(与JDK自带J.U.A的Arrays.sort算法进行对比) 子类需要重载showtime方法来实现具体的排序 yuanjun.chen.base.sort.BubbleSortAlgo.java 冒泡排序实现类,...

    java排序四种算法

    这里有四种常见的排序算法,它们分别是冒泡排序、插入排序、选择排序以及Java内置的`Arrays.sort()`或`Collections.sort()`方法,这些方法通常利用了更高效的排序算法,如快速排序、归并排序等。下面我们将对这四种...

    Why java Arrays use two different sort algorithms for different types?

    Java的`Arrays.sort()`方法实际上有两种主要的排序算法:快速排序(QuickSort)变体和插入排序(Insertion Sort)混合的Timsort。Timsort是一种稳定排序算法,由Tim Peters为Python设计,后来被引入到Java中。...

    Java中Arrays类详解.docx

    在Java编程语言中,`java.util.Arrays`类是一个非常实用的工具类,它...需要注意的是,虽然`Arrays`类提供了许多便利,但在处理大型数据集时,性能可能不如专门设计的算法高效,因此在性能敏感的场景下需要谨慎选择。

    java-GenericSort-源码.rar

    而排序则是数据处理中的常见需求,Java提供了多种排序算法的实现,如Arrays.sort和Collections.sort等。本篇将深入解析Java泛型排序的源码,理解其背后的工作原理。 1. **泛型的概念与作用** 泛型是Java SE 5.0...

    java performance12

    `Arrays.sort()` 方法实现了快速排序算法。对于对象数组,它会先创建一个与原数组相同的副本,然后对该副本进行排序。 ```java public static void sort(Object[] a) { Object aux[] = (Object[]) a.clone(); ...

    Java 中的字符串排序(两种不同的方式).docx

    不使用`sort()`方法的冒泡排序算法的时间复杂度为O(n^2),而使用`sort()`方法的`Arrays.sort()`时间复杂度通常为O(n log n),在大多数情况下更为高效。 在实际开发中,除非有特定需求,否则通常会优先选择使用`...

    Java之数组+变量.docx

    1.1 Arrays.sort(数组):对数组排序,对于基本类型的数组使用优化后的快速排序算法,效率高。对引用类型数组,使用优化后的合并排序算法。 1.2 Arrays.toString(数组):把数组里的数据,用逗号连接成一个字符串。...

    JAVA数组的排序方法实例.docx

    ### JAVA数组的排序方法实例 #### 内容概述: 本文档详细介绍了两种在Java中...而`Arrays.sort()`则利用了更高效的排序算法,适用于大多数情况下的数组排序需求。在实际开发中,应根据具体情况选择合适的排序算法。

Global site tag (gtag.js) - Google Analytics