排序(六)-堆排序
2015-03-27 21:03
169 查看
稳定性:unstable sort
空间:In-place sort
最优复杂度:O(nlgn)
最差复杂度:O(nlgn)
伪代码:
Max_Heapify(A,i)
{
heapsize = heapsize[A];
largest = i;
if left(i) <= heapsize && A[largest] < A[left(i)]
largest = left(i);
else if right(i) <= heapsize && A[largest] < A[right(i)]
largest = right(i);
if(largest != i)
swap A[i] <-> A[largest];
Max_Heapify(A,largest);
}
build_max_heap(A)
{
for i=floor(n/2) to 1
Max_Heapify(A,i);
}
heapsort(A)
{
build_max_heap(A);
for i=n to 2
swap A[1] <->A[heapsize]
heapsize--;
Max_Heapify(A,1);
}
Java代码:
import java.util.Arrays;
public class Main {
int heapsize;
public static void main(String[] args){
Main m = new Main();
int[] A = {0,1,2,3,5,4,7,9,1,2,5,3,2,1};
m.heapSort(A);
System.out.println(Arrays.toString(A));
//输出:[1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 7, 9]
}
public void maxHeapify(int[] A,int i){
int largest = i;
if(left(i) <= heapsize && A[largest] < A[left(i)])
largest = left(i);
if(right(i) <= heapsize && A[largest] < A[right(i)])
largest = right(i);
if(largest != i){
swap(A,i,largest);
maxHeapify(A,largest);
}
}
public void buildMaxHeap(int[] A){
heapsize = A.length - 1;
for(int i = (A.length-1)/2; i > 0; --i){
maxHeapify(A,i);
}
}
public void heapSort(int[] A){
buildMaxHeap(A);
for(int i = (A.length-1); i > 1; --i){
swap(A,1,heapsize);
heapsize--;
maxHeapify(A,1);
}
}
public int left(int i){
return 2 * i;
}
public int right(int i){
return 2 * i + 1;
}
public void swap(int[] A,int x,int y){
int temp = A[x];
A[x] = A[y];
A[y] = temp;
}
}
空间:In-place sort
最优复杂度:O(nlgn)
最差复杂度:O(nlgn)
伪代码:
Max_Heapify(A,i)
{
heapsize = heapsize[A];
largest = i;
if left(i) <= heapsize && A[largest] < A[left(i)]
largest = left(i);
else if right(i) <= heapsize && A[largest] < A[right(i)]
largest = right(i);
if(largest != i)
swap A[i] <-> A[largest];
Max_Heapify(A,largest);
}
build_max_heap(A)
{
for i=floor(n/2) to 1
Max_Heapify(A,i);
}
heapsort(A)
{
build_max_heap(A);
for i=n to 2
swap A[1] <->A[heapsize]
heapsize--;
Max_Heapify(A,1);
}
Java代码:
import java.util.Arrays;
public class Main {
int heapsize;
public static void main(String[] args){
Main m = new Main();
int[] A = {0,1,2,3,5,4,7,9,1,2,5,3,2,1};
m.heapSort(A);
System.out.println(Arrays.toString(A));
//输出:[1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 7, 9]
}
public void maxHeapify(int[] A,int i){
int largest = i;
if(left(i) <= heapsize && A[largest] < A[left(i)])
largest = left(i);
if(right(i) <= heapsize && A[largest] < A[right(i)])
largest = right(i);
if(largest != i){
swap(A,i,largest);
maxHeapify(A,largest);
}
}
public void buildMaxHeap(int[] A){
heapsize = A.length - 1;
for(int i = (A.length-1)/2; i > 0; --i){
maxHeapify(A,i);
}
}
public void heapSort(int[] A){
buildMaxHeap(A);
for(int i = (A.length-1); i > 1; --i){
swap(A,1,heapsize);
heapsize--;
maxHeapify(A,1);
}
}
public int left(int i){
return 2 * i;
}
public int right(int i){
return 2 * i + 1;
}
public void swap(int[] A,int x,int y){
int temp = A[x];
A[x] = A[y];
A[y] = temp;
}
}
相关文章推荐
- 排序(插入排序、希尔排序、堆排序、归并排序、快速排序法)
- 对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较
- 树形排序与堆排序
- 选择排序(直接选择排序,堆排序)
- 排序基础之归并排序、快排、堆排序、希尔排序思路讲解与Java代码实现
- 快速排序,归并排序,堆排序,基数排序,插入排序,希尔排序,
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 堆排序(改良的选择排序)
- 排序-堆排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- 不稳定排序之选择、快速、希尔以及堆排序
- 排序——堆排序
- 【每日算法】选择排序算法之堆排序
- 内部排序之堆排序
- 图解"数据结构--内部排序算法"----选择排序:直接选择排序、堆排序
- 数据结构-选择排序-堆排序
- 第十六周项目4—选择排序之堆排序
- 排序方法之堆排序
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)