`
fishisnow
  • 浏览: 5376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

堆排序

阅读更多
java实现

大跟堆
package com.practice;

public class BigHeap {
	public void shift(int[] arr, int k, int m) {
		int i = k, j = 2 * i + 1;
		while(j<m) {
			if(j<m-1 && arr[j]<arr[j+1]) j++;
			if(arr[i] > arr[j]) break;
			else {
				swap(arr, i, j);
				i = j;
				j = 2*i + 1;
			}
		}
	}

	private void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	
	public void sort(int[] arr, int n) {
		for(int i=n/2 -1;i>=0;i--) 
			shift(arr, i, n);
		for(int i=0;i<n;i++) {
			System.out.print(arr[0]+",");
			swap(arr, 0, n-i-1);
			shift(arr, 0, n-i-1);
		}
	}
	
}



小跟堆实现的堆排序,获取最小的K个数的值。
package com.practice;

public class HeapSort {
	public void sift(int arr[], int k, int m) {
		int i = k, j = 2 * i + 1;
		while(j<m) {
			if(j<m-1 && arr[j]>arr[j+1])	j++;
			if(arr[i]<arr[j])	break;
			else {
				swap(arr, i, j);
				i = j;
				j = 2 * i +1;
			}
		}
	}

	private void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	
	public void sort(int[] arr, int n) {
		for(int i=n/2-1;i>=0;i--) {
			sift(arr, i, n);
		}

	}
	
	public void getTopK(int[]arr, int k) {
		sort(arr, arr.length);
		for(int i=0;i<k;i++) {
			System.out.print(arr[0]+" ");
			swap(arr, 0, arr.length-i-1);
			sift(arr, 0, arr.length-i-1);
		}
	}
	
	public static void main(String[] args) {
		int[] arr = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };
		new HeapSort().getTopK(arr, 5);;
	}
}

输出:0 1 2 3 4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics