快速排序与堆排序的Java实现(泛型)

原创 2016年08月31日 15:56:44

快速排序与堆排序的Java实现(泛型)

快速排序及堆排序是经常用到的排序方法(虽然他们并不是稳定的排序算法),作为一名程序员,不仅要能非常熟练的讲出他们的思想,也要能熟练的写出相应的实现代码(并不复杂。。。。)
虽然各大语言都有封装好的排序算法,但是自己动手写一写,还是有些收获的。

快排

快速排序以及快速排序的思想的使用非常广泛,贴出自己写的一个泛型的实现

package quicksort;

import java.util.List;
import java.util.ListIterator;

public class QuickSort {

    @SuppressWarnings("unchecked")
    public static <E extends Comparable<? super E>> void sort(List<E> list) {
        Object[] objs = list.toArray();
        partition(objs, 0, objs.length-1);
        ListIterator<E> iterator = list.listIterator();
        for(int i=0; i<objs.length; ++i) {
            iterator.next();
            iterator.set((E)objs[i]);
        }
    }

    private static void partition(Object[] objs, int left, int right) {
        if(left >= right) return;
        int i = left;
        int j = right;
        @SuppressWarnings("unchecked")
        Comparable<Object> temp = (Comparable<Object>)objs[i];
        while( i < j ) {
            while(temp.compareTo(objs[j]) < 0 && i<j) --j;
            if(i == j) break;
            objs[i] = objs[j];
            ++i;
            while(temp.compareTo(objs[i]) > 0 && i<j) ++i;
            if(i == j) break;
            objs[j] = objs[i];
            --j;
        }
        objs[i] = temp;
        partition(objs, left, i-1);
        partition(objs, i+1, right);
    }
}

堆排序

堆排序特别适合在大数据下,选出topK的情况

package heapsort;

import java.util.ArrayList;
import java.util.List;

public class HeapSort {

    public static <E extends Comparable<? super E>> void sort(List<E> list) {
        if(list == null || list.size() == 0) return;
        Object[] a = list.toArray();
        buildHeap(a);
        int index = a.length-1;
        while(index > 0) {
            swap(a, 0, index);
            --index;
            reBuildHeap(a, 0, index);
        }
        print(a);
    }

    @SuppressWarnings("unchecked")
    private static void reBuildHeap(Object[] a, int firstIndex, int lastIndex) {
        int i = firstIndex;
        int j = i*2 + 1;
        while(j<=lastIndex) {
            Comparable<Object> compAj = (Comparable<Object>)a[j];
            if(j<lastIndex) {
                if(compAj.compareTo(a[j+1]) < 0) {
                    ++j;
                    compAj = (Comparable<Object>)a[j];
                }
            }
            if(compAj.compareTo(a[i]) > 0) swap(a, i, j);
            i = j;
            j = i*2 + 1;
        }
    }

    private static void buildHeap(Object[] a) {
        int index = a.length-1;
        index = (index-1)/2;
        while( index >= 0) {
            reBuildHeap(a, index, a.length-1);
            --index;
        }
    }

    private static void print(Object[] a) {
        for(Object i:a) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    private static void swap(Object[] a , int i, int j) {
        Object temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年04月27日 18:34
  • 7538

基本算法_堆排序_Java实现

堆排序就是将序列调整为指定的堆,然后调整首尾元素的位置,取出末尾元素,反复进行,直到将所有元素取出,形成一个有序的序列。...
  • ljmingcom304
  • ljmingcom304
  • 2015年12月22日 14:14
  • 1869

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如...
  • kimylrong
  • kimylrong
  • 2013年12月05日 22:25
  • 53016

java堆排序非递归代码,无原理版,比较好理解

public class HeapOperate { /* * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求 */ public static vo...
  • zhuqiuhui
  • zhuqiuhui
  • 2016年04月21日 23:01
  • 768

堆排序分析及优化

堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大,具体算法步骤如下。 一、创建堆         首先将数组中的元素调整成堆,对应下面程序中的createHeap(...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年04月09日 15:21
  • 1379

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大...
  • qq_21492635
  • qq_21492635
  • 2017年06月12日 14:23
  • 348

堆排序Heap Sort——浅显易懂+Java实现

最近在恶补一些计算机基础内容,看到了堆排序,想想以前常说堆栈堆栈,但我竟然连堆有哪些应用都记不得了,所以,重温了堆排序后,我来给大家分享一下,希望能对大家有所帮助。(代码实现不采用伪代码,使用java...
  • sunnylinner
  • sunnylinner
  • 2016年09月19日 14:47
  • 1998

三种排序算法(归并排序、快速排序,堆排序)

归并排序 快速排序 堆排序 java实现
  • stephenxe
  • stephenxe
  • 2016年07月18日 18:40
  • 2149

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中...
  • l243225530
  • l243225530
  • 2015年07月26日 16:02
  • 1001

TopK问题探索-最小堆JAVA实现

TopK问题是指从
  • tang9140
  • tang9140
  • 2014年08月16日 10:31
  • 1432
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序与堆排序的Java实现(泛型)
举报原因:
原因补充:

(最多只允许输入30个字)