jdk_Arrays类_排序方法_研究

 private static void sort1(int x[], int off, int len) {
	// Insertion sort on smallest arrays
	//长度小于7,采用冒泡排序
	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;
	}

	//长度不小于7,采用快速排序,此处为生成第一次进行划分的元素的位置m
	//第一个划分元素为 int v = x[m]
	// Choose a partition element, v
	/m的开始值为中间位置
	int m = off + (len >> 1);       // Small arrays, middle element
	//len>7,获取划分元素位置m
	if (len > 7) {
	    int l = off;		//起始位置
	    int n = off + len - 1;	//末尾位置
	    //len>40,将其分3段,然后取每段的中间(比大小)元素
	    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];

	//建立如下(v* (<v)* (>v)* v*)的序列
	// 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);
    }

    /**
     * Swaps x[a] with x[b].
     */
    private static void swap(int x[], int a, int b) {
	int t = x[a];
	x[a] = x[b];
	x[b] = t;
    }
    //写的很精巧,就是取x[a],x[b],x[c],这三个元素的中间元素
    private static int med3(int x[], int a, int b, int c) {
	return (x[a] < x[b] ?
		(x[b] < x[c] ? b : x[a] < x[c] ? c : a) :
		(x[b] > x[c] ? b : x[a] > x[c] ? c : a));
    }
   /**
     * Swaps x[a .. (a+n-1)] with x[b .. (b+n-1)].
     */
    private static void vecswap(int x[], int a, int b, int n) {
	for (int i=0; i<n; i++, a++, b++)
	    swap(x, a, b);
    }

jdk_Arrays类_排序方法_研究

时间: 2025-01-13 12:34:45

jdk_Arrays类_排序方法_研究的相关文章

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总 转自:http://midasyang.blog.163.com/blog/static/189744104201141245344681/ 启动不显示主窗体如果通过Form1.Visible:=False;语句来实现的话,会出现主窗体一闪而过的情形.更好的办法是在OnShow事件中添加Application.ShowMainForm := False; 程序不出现在任务栏procedure TForm1.FormShow(S

JAVA Collections工具类sort()排序方法

主要分析内容: 一.Collections工具类两种sort()方法 二.示例 一.Collections工具类两种sort()方法 格式一: public static <T extends Comparable<? super T>> void sort(List<T> list) 说明:该方法中的泛型<T>都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序.如果其他类型的数据要进行比较排序,必须继承Co

动态规划_基础_最长公共子序列_多种方法_递归/dp

D: 魔法少女资格面试 题目描述 众所周知,魔法少女是一个低危高薪职业.随着近年来报考魔法少女的孩子们越来越多,魔法少女行业已经出现饱和现象!为了缓和魔法少女界的就业压力,魔法少女考核员丁丁妹决定增加魔法少女资质考核的难度.然而,即使如此,通过资质考核的魔法少女们数量仍然过多,因此,丁丁妹决心增加一轮面试,从而淘汰掉更多的预备魔法少女.具体而言,她打算对所有面试者询问这样一个问题:给两个长度为 n 的全排列,它们的最长公共子序列长度是多少?不幸的是,由于丁丁妹没有好好上过学,她自己也不知道答案是

javascript 自己实现数字\字母和中文的混合排序方法 by FungLeo

javascript 自己实现数字\字母和中文的混合排序方法(纯粹研究,不实用) 前言 在上一篇博文<javascript 数组排序sort方法和自我实现排序方法的学习小结>中,我用自己的方法实现了数字数组的排序. 当然,实际运用中,我还是会使用sort方法更加方便.但是,我上一篇博文,仅仅是实现了数字排序,而srot方法默认可是能给字母实现排序的哦!而我的代码只能排序数字,看起来还是弱弱的. 所以,我得加上能排字母甚至中文的排序方法. 实现代码 $(function(){ var arr =

iOS_21团购_通过block对请求工具类的代理方法进行二次封装

最终效果图: [点评]提供的工具类DPAPI 在请求完毕后,使用的是代理机制,当一次请求成功或者失败时,会调用代理的相应方法 为了将点评提供的工具类DPAPI进行二次封装, 再次定义了一个block: typedef  void(^RequestDoneCallBackBlock)(id deals,NSError *err); 该block有两个参数, 分别是成功时,服务器返回的deals字典数组 另一个参数是:请求失败时,服务器返回的失败信息 两个参数分别对应代理的两个方法(即成功.失败时分

ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

1 /* 2 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 3 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 4 出现了回路!用这种方法必须将重边去除掉! 5 6 所以推荐用dfs方式进行判断!这种方式还是比较直观的! 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<algorith

多线程_创建线程_继承Thread类

public class ThreadDemo {   public static void main(String[] args){         Demo d = new Demo();   d.start();      for(int i = 0;i < 100;i++){      System.out.println("MainThread" + i);   }   } } class Demo extends Thread {   public void run(

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

String类中的常用方法_判断

字符串判断:1,字符串石佛包含某个字符串.boolean contains(str); 特殊之处:indexOf(String str),如果返回的值是-1,那么就表示不包含这个字符串 也可以实现判断. 2,字符串是否有内容.boolean isEmpty() 字符串为空时返回true 3,字符串是否以指定内容开头  boolean startsWith(String str) boolean startsWith(String str,int fromindex); 4,字符串是否以指定内容结