java 通配符的应用 java 排序算法

Technorati 标记: java,排序算法,通配符

    这几天无聊,又重新学起java的排序算法,为DualPivotQuickSort做准备。为了更好地适应各种情况,我们选择使用通用类型T和通配符的上下界来实现,同时这次谈的是对数组对象的排序。如果你对java 通配符的了解不深的,可以点击 这里 。

    现在假设有如下排序方法:

public static <T> void sort(T[] a, int n)

    因为对象之间可以比较大小,数组对象必须是实现Comparable接口的。因此T所表示的类必须实现接口Comparable。为此需要为T添加一个上界,如下:

public static <T extends Comparable<T>> void sort(T[] a, int n)

    如此,便指定了传递给Sort的对象数组必须是可比较的.为了sort()方法可以更加贴近实际的需要,现在再做一点改进.

    现在使用sort()方法对10个Integer对象排序如下:

sort(intArray,10);

    代码”T extends Comparable<T>“要求Integer必须实现Comparable<Integer>,并且数组内的对象都必须是Integer对象。详细的使用细则,可参考 java 通配符解惑。    T的对象不仅可以与T的其他对象相互比较,也应该可以与T的超类对象相比较。因此,取代”T extends Comparable<T>“的另一种写法是:

public static <T extends Comparable<? super T>> void sort(T[] a, int n)

             “?”代表任意类型,而“? super T”则意味着T的任意超类。写成Comparable<? super T>,就可以对任意类型使用Comparable。 一、选择排序:

    选择排序是最基本的排序算法 ,一般不怎么用,可却是学排序最基本的算法,了解一下总无害。

    迭代伪代码:

for i = 0:n-1,k = ifor j = i+1:n-1, if a[j] < a[k], k = j//a[k] 总是a[i..n]最小的那一个swap a[i,k]//排序的最后结果:a[1..i]end

性能:

    最坏的情况:О(n2)

    最好的情况:О(n2)

    平均状况:О(n2)

    不稳定

    额外需要的空间:O(n)

java 实现:

public static <T extends Comparable<? super T>> void selectionSort(T[] a){int smallestIndex;for(int i = 0;i < a.length; i++){smallestIndex = i;for (int j = i+1; j < a.length; j++) {if (a[j].compareTo(a[smallestIndex]) < 0) {smallestIndex = j;}}swap(a, i, smallestIndex);}}swap(Object[] a, int i, int j) {Object temp = a[i];a[i] = a[j];a[j] = temp;}

  二、插入排序

    插入排序在最坏情况下的效率是O(n2)。在大部分元素已排好序或者排序的元素数量少的情况下,一般选择使用插入排序(因为它是低开销)。

    伪代码:

for i = 1:n,for (k = i; k > 0 and a[k] < a[k-1]; k–)swap a[k,k-1]end

性能(效率):

    最坏的情况:О(n2)比较,О(n2)交换

    最好的情况:O(n) 比较, O(1) 交换

    平均状况:О(n2)比较,О(n2)交换

    稳定

    额外需要的空间:O(n)

      

java 实现:

public static <T extends Comparable<? super T>> void insertionSort(T[] a) {int len = a.length;for (int i = 1; i < len; i++) {for (int k = i; (k > 0) && (a[k].compareTo(a[k – 1]) < 0); k–) {swap(a, k, k – 1);}}}

三、冒泡排序

    冒泡排序与插入排序有很多相似的地方,只不过是冒泡排序的开销稍高。

    伪代码:

for i = 0:n-1,swapped = falsefor j = n-1:i+1,if a[j] < a[j-1],swap a[j,j-1]swapped = not swappedend

性能:

    最坏的情况:О(n2)

    最好的情况:

    平均状况:О(n2)

    稳定

    额外需要的空间:O(n)

java实现:

public static <T extends Comparable<? super T>> void bubbleSort(T[] a) {boolean swapped;for (int i = 0; i < a.length; i++) {swapped = false;for (int j = a.length – 1; j > i; j–) {if (a[j].compareTo(a[j – 1]) < 0) {swap(a, j, j – 1);swapped = true;}}if (!swapped) { break; }}}

四、希尔排序

    希尔排序属于插入类排序,,是将整个无序列分割成若干小的子序列分别进行插入排序。将要排序的一组数按某个增量 gap 分成 gap 组,每组中记录的下标相差 gap.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

性能:

    最坏的情况:取决于增量(在这里的基底是3)

    最好的情况:取决于增量

    平均状况:取决于增量

    不稳定

    额外需要的空间:O(n)

java实现:

看自家总在期待,不知将来好歹,新乐吧总在不断等待,

java 通配符的应用 java 排序算法

相关文章:

你感兴趣的文章:

标签云: