Comparable和Comparator引发的思考

最近在学习Comparable和Comparator 的区别,在学习的过程中发现,如果单从表明现象来理解这两个东西是比较费劲的。于是写了两个Demo,一步一步的查看这两个种的内部实现原理,其实绕来绕去都是使用TimSort 对一个数组进行排序。如果要想更轻松的理解对Comparable和Comparator 的使用,我们可以将其简单的缩略为普通插入排序来理解,让插入元素和有序区从前到后的一个个元素进行比较Compare(将要插入的元素,Element
O) 或者 插入元素.CompareTo(Element O),当两个Compare结果小于0时 ,交换两个元素,所有中间元素后移一位,使有序区有序。关键在于compare结果小于0,交换来定制排序。知道这个简单原理之后,我们就可以更娴熟利用Comparable和Comparator来定制自己的排序了。

TimSort就是二分插入排序和优化版的归并排序的结合体。当数组元素数量小于某个值时,采用二分插入排序时间复杂度为O(N*lgN),当数据大的时候采用更为高效的归并排序。

这里我贴出二分插入排序的算法:

package binary_insertion;

public class BinaryInsertionDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = {5,4,3,2,1};
		sort(a, 0, a.length, 0);

		for (int s : a) {
			System.out.print(s + " ");
		}
	}
	//二分插入排序  时间复杂度O(N*lgN)
	static void sort(int[] a, int lo, int hi, int start) {
        if (start == lo)
            start++;
        for ( ; start < hi; start++) {
            int pivot = a[start];

            // Set left (and right) to the index where a[start] (pivot) belongs
            int left = lo;
            int right = start;
            assert left <= right;

            while (left < right) {
                int mid = (left + right) >>> 1;
                if (pivot - a[mid] < 0)
                	right = mid;
                else
                    left = mid + 1;
            }

            int n = start - left;
            switch (n) {
                case 2:  a[left + 2] = a[left + 1];
                case 1:  a[left + 1] = a[left];
                         break;
                default: System.arraycopy(a, left, a, left + 1, n);
            }
            a[left] = pivot;
        }

	}

}

对于优化版的归并排序,后续再研究。。。

时间: 2024-10-08 17:45:23

Comparable和Comparator引发的思考的相关文章

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素. ②E next()方法:指针后移,并返回当前元素.E代表泛型,默认为Object类型. ③void remove()方法:在原集合中删除刚刚返回的元素. 2)对于List集合而言,可以通过基于下标的

似懂非懂的Comparable与Comparator

jdk1.8.0_41 一知半解写代码, 集合排序用个啥. 抄起键盘胡乱打, 似懂非懂最可怕. Comparable与Comparator都是用于集合的排序,对于大多数人来说Comparator可能略微比Comparable要熟悉一点,类似下面这几句代码的使用频率应该是最高的. Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return

Java中Comparable和Comparator实现对象比较

1.通过Comparable实现排序 package Comparable; import java.util.Arrays; public class ComparableUser implements Comparable<ComparableUser> { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; } publi

java 数组比较,元素的比较,Comparable,Comparator比较的应用实现,排序,查找示例

java 数组比较,元素的比较,自定义Comparator的实现,排序,查找示例 package org.rui.array.compar; import java.util.Arrays; import java.util.Random; import org.rui.generics.anonymity.Generator; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,

对象大小对比之Comparable与Comparator

一 概述 1.Comparable与Comparator使用背景 数值型数据(byte int short long float double)天生可对比大小,可排序,String实现了Comparable接口也可以对比大小与排序,而自定义类多种多样,没有一个共有的可以用作排序的指标,因此需要在自定义类中手动建立对比的方法,出于这个目的,java提供了两个接口Comparable与Comparator. 2.集合排序 Collections.sort()底层排序依靠的是Arrays.sort()

comparable 与 comparator

工作时间久了,偶尔会迷糊..... comparable 与 comparator 区别:(策略模式) 一般需要比较或者排序的类,都需要实现 comparable ,实现comparable就需要去重写 compareto方法,一般需要在这个方法里写明具体需要怎么比较,那么问题来了,如果以后类的比较方式变了的话,这个compareto方法就需要修改: 故根据策略模式,将需要比较的具体实现交给comparator接口,需要具体比较的话就实现comparator接口重写compare方法,返回int

java Comparable和Comparator

在java数组.Collection和Map的排序中,经常会用到Comparable和Comparator这两个接口. 1.Comparable 我们可以通过Arrays.sort()方法给数组排序: public static void main(String[] args) { int[] intArr={1,5,7,6,3,4}; Arrays.sort(intArr); System.out.println(Arrays.toString(intArr)); /* output: [1,

曲演杂坛--一条DELETE引发的思考

原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID INT IDENTITY(1,1) PRIMARY KEY, DT DATETIME ) 每次业务想要获取一个新ID,就执行以下SQL: INSERT INTO TB001(DT) SELECT GETDATE(); SELECT @@IDENTITY 由于这些数据只需保留最近一天的数据,因此建立一个SQL作业来定期删除数据,删除脚

比较器(Comparable、Comparator)类及 二叉树的排序算法

之前Arrays 类中存在sort() 方法, 此方法可以直接对 对象数组进行排序. 1.Comparable接口 可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口. Comparable 接口定义如下: public interface Comparable<T>{ public int compareTo(T o); } 此方法返回一个int 类型的数据,但是此int 的值只能是以下三种: 1:表示大于