排序算法-选择排序

 选择排序

private static int leftChild(int i){
		return 2*i+1;
	}
	private static void perc(int[] a,int i,int n){   //调整堆的方法
		int child;
		int temp;
		for(temp=a[i];leftChild(i)<n;i=child){
			child=leftChild(i);
			if(child!=n-1&&a[child]<a[child+1])//比较左右孩子的大小
				child++;
			if(temp<(a[child]))                //根节点小于左右孩子
				a[i]=a[child];
			else
				break;
		}
		a[i]=temp;//
	}
	public static void heaps(int[] a){         //堆排序的地方法
		for(int i=a.length/2;i>=0;i--){        //初始化堆,从最后一个非终端节点至根节点
			perc(a,i,a.length);
		}
		for(int i=0;i<a.length;i++){           //重复执行移走对顶及重建堆的操作
			int temp=a[0];
			a[0]=a[a.length-i-1];
			a[a.length-i-1]=temp;
			perc(a, 0, a.length-i-1);          //重建堆
		}
	}
	public static void main(String[] args) {
		int r[]={50,40,45,36,32,18,22,30};
		System.out.println("原始的序列:");
		for(int i=0;i<8;i++){
        	System.out.print("  "+r[i]);
        }
		heaps(r);
		System.out.println("\n"+"排序好的序列:");
        for(int i=0;i<8;i++){
        	System.out.print("  "+r[i]);
        }
	}
public static void sift(int[] r,int k,int m){
		int i=k;
		int j=2*i;
		while(j<=m){
			if(j<=m&&r[j]<r[j+1]){
				j++;}
			if(r[i]>r[j]) break;
			else{
				int temp;
				temp=r[i];
				r[i]=r[j];
				r[j]=temp;
				i=j;
				j=2*i;
			}
		}
	}
	public static void heasp(int r[],int n){
		int i;
		for(i=n/2;i>=0;i--){
			sift(r, i, n);
		}
		for(i=0;i<n;i++){
			int temp=r[0];
			r[0]=r[n-i+1];
			r[n-i+1]=temp;
			sift(r, 1, n-i);
		}
		for( i=0;i<8;i++){
			System.out.print("  "+r[i]);
		}
	}
	public static void main(String[] args) {
		int a[]={50,40,45,36,32,18,22,30};
		heasp(a,7);
		}
public static void main(String[] args) {
		int r[]={49,27,65,97,76,13,38,5,12,56};
		int i,j,index,temp;
		System.out.println("初始序列的数组为:");   
        	for(i=0;i<10;i++){  	          //对n个记录进行n-1趟的选择排序
        		System.out.print(r[i]+"  ");
       		}
		for(i=0;i<9;i++){
			index=i;                      //初始化第i趟选择排序的最小记录的指针
			for(j=i+1;j<10;j++){          //在无序区选取最小记录
				if(r[j]<r[index]){
					index=j;
				}
			}
			if(index!=i){                 //将最小记录与r[i]交换
				 temp=r[i];
				 r[i]=r[index];
				 r[index]=temp;
			}
		}
		System.out.println("\n"+"排序好的数组为:");
        	for(i=0;i<10;i++){  	
        		System.out.print(r[i]+"  ");
        	}
} 

 

 

你可能感兴趣的:(排序算法-选择排序)