快速排序+归并排序+堆排序

快速排序其实可看成每次通过比较获得基准值privot所处的位置,这个可以看作是划分。因为划分复杂,所以合并简单,合并就直接不用做,因为划分时,将每个元素最终的位置都固定。
斜体样式
quickSort:

public class QuickSort{
	public static void sort(int[] a, int i, intj){
		if(i>=j) return;
		int low=i;
		int high=j;
		int privot=a[i];
		while(low<high){
			while(low<high&&a[high]>=privot) high--;
			  a[low]=a[high];
			  while(low<high&&a[low]<=privot) low++;
			  a[high]=a[low];
		}
		a[low]=privot;
		sort(a,i,low-1);
		sort(a,low+1,j);
	}
	public static void quickSort(int[] a){2
		sort(a,0,a.length-1)
	}
	public static void main(String[] args){
		int[] a={5,4,6,9,7,1,3,2};
		quickSort(a);
		for(int i=0;i<a.length;i++){
				System.out.println(a[i]+" ");
			}
	}
}

归并排序:分而治之
先从中间一分为二 一直划分到单个节点
然后将相邻区间元素合并

public class MergeSort{
	public static void merge(int[] a, int p, int q, int r){
		int n1=q-p+1;
		int n2=r-q;
		int i=0,j=0,k=0;
		int[] L=new int[n1];
		int[] R=new int[n2];
		for(i=0,k=p;i<n1;i++,k++ ){
			L[i]=a[k];
		}
		for(j=0,k=q+1;j<n2;j++,k++){
			R[j]=a[k];
		}
		for(i=0,j=0,k=p;i<n1&&j<n2;k++){
			if(L[i]<R[j]){
				a[k]=L[i];
				 i++;
			}else{
				a[k]=R[j];
				j++;
			}
		}
		if(i<n1){
			while(i<n1){
					a[k]=L[i];
					i++;
					k++;
				}
		}
		if(j<n2){
			while(j<n2){
					a[k]=R[j];
					j++;
					k++;
				}
		}
	}
	public static void mergeSort(int[] a, int p, int r){
		if(p<r){
			int q=(p+r)/2;
			mergeSort(a, p,q);
			mergeSort(a,q+1,r);
			merge(a,p,q,r);
		}
	}
	public static void main(String[] args){
		int[] a = {5,4,8,9,7,6,1,3,2};
		mergeSort(a);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]+" ");
		}
	}
}

堆排序:
思路:数组看成是一个完全二叉树的顺序存储结构
从最后一个非叶子节点(len/2-1)开始向下调整,–》形成一个大顶堆(小顶堆)
然后将堆中最后一个元素与第一个元素互换,再从根节点开始调用向下调整,只不过长度减1, 每次互换之后 都能够获得一个最大值 从而实现最后的排序

public class HeapSort{
	public static void adjustMaxHeap(int[] a,int pos, int len){
		int temp=a[pos];
		int child=0;
		for(child=2*pos+1;child<=len;pos=child){
				if(child<len&&a[child+1]>a[child]){
						child++;
				}
				if(a[child]>a[temp]){
						a[pos]=a[child];
				}
		}
		a[pos]=temp;
	}
	public static void heapSort(int[] a){
		int len = a.length;
		for(int i=len/2-1;i>=0;i--){
			adjustMaxHeap(a,i,len-1);
		}
		for(int i=len-1;i>=0;i--){
			int tmp=a[i];
			a[i]=a[0];
			a[0]=temp;
			adjustMaxHeap(a,0,i-1);
		}
	}
	public static void main(String[] args){
		int [] a={23,45,12,9,10,1};
		heapSort(a);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]+" "``);
		}
	}
}

你可能感兴趣的:(快速排序+归并排序+堆排序)