快速排序与堆排序的Java实现(泛型)
2016-08-31 15:56
169 查看
快速排序与堆排序的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代码实现
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- Java 实现 堆排序 快速排序 以及 TopK问题(二)
- Java 实现 堆排序 快速排序 以及 TopK问题(一)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- Java实现快速排序、归并排序、堆排序和希尔排序
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- java实现:快速排序,基数排序,计数排序,归并排序,堆排序,希尔排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- 【Java】快速排序、归并排序、堆排序、基数排序实现总结
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- Java实现快速排序、归并排序、堆排序
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- 快速排序--Java实现
- 快速排序java实现
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序