Java面试宝典——希尔排序+堆排序

package demos.order;
/** 
 * @author wyl
 * @time 2018年7月12日下午1:43:43
 * 希尔排序:即缩小增量排序
 * 基本原理:
 * 	先将待排序的数组元素分成多个子序列,使得每个子序列的元素个属性相对较少,
 * 	然后对各个子序列进行直接插入排序,
 * 	待整个序列“基本有序后”,在对所有元素进行一次直接插入排序
 */
public class ShellSort {

	public static void shellSort(int[] a){
		int i,j,h;
		int tmp;
		for(h=a.length/2;h>0;h/=2){
			for (i=h;i<a.length;i++) {
				tmp=a[i];
				for(j=i-h;j>=0;j-=h){
					if (tmp<a[j]) {
						a[j+h]=a[j];
					}else {
						break;
					}
				}
				a[j+h]=tmp;
			}
		}
	} 
	
	public static void print(int[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {

		int[] a={4,2,8,9,0,6,7,1};
		shellSort(a);
		print(a);
	}

}
package demos.order;
/** 
 * @author wyl
 * @time 2018年7月12日下午1:43:43
 * 堆排序:两个过程:①构建堆②交换堆顶元素与最后一个元素的位置
 * 思想:
 * 	对于给定的n个记录,初始时把这些记录看做一个顺序存储的二叉树,
 * 	然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素进行交换后,堆的最后一个元素即为最大记录;
 * 	接着将前 n-1个元素(即不包括最大记录)重新调整为一个大顶堆,
 * 	在将堆顶元素与当前堆的最后一个元素交换后得到次大的记录,
 * 	重复该过程,直到调整堆中只剩下一个元素为止,该元素即为最小记录,此时得到一个有序序列。
 */
public class HeapSort_2 {

	public static void heapSort(int[] a){
		int i;
		int len=a.length;
		for(i=len/2-1;i>=0;i--){
			adjustMinHeap(a,i,len-1);
		}
		
		for(i=len-1;i>=0;i--){
			int tmp=a[0];
			a[0]=a[i];
			a[i]=tmp;
			adjustMinHeap(a, 0, i-1);
		}
		
	} 
	
	private static void adjustMinHeap(int[] a, int pos, int len) {
		// TODO Auto-generated method stub
		int tmp;
		int child;
		for(tmp=a[pos];2*pos+1<len;pos=child){
			child=2*pos+1;//孩子结点的位置
			if (child<len&&a[child]>a[child+1]) {//找到孩子结点值最小的位置
				child++;
			}
			if (a[child]<tmp) { //孩子结点小于当前节点~~~当前结点指向孩子结点
				a[pos]=a[child];
			}else {
				break;
			}
		}
		a[pos]=tmp;
	}

	public static void print(int[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {

		int[] a={4,2,8,9,0,6,7,1};
		heapSort(a);
		print(a);
	}

}

猜你喜欢

转载自blog.csdn.net/u014067137/article/details/81015060
今日推荐