28.八大排序算法

package java2019;

import java.util.ArrayList;

//最小的K个数(附加8大排序算法)
public class Demo28 {
	//1.冒泡排序
	public static ArrayList<Integer> GetLeastNumbers(int [] input,int k){
		ArrayList<Integer> list = new ArrayList<Integer>();
		if(k>input.length)
			return list;
		for(int i=0;i<k;i++){
			for(int j=0;j<input.length-1-i;j++){
				if(input[j]<input[j+1]){
					int temp = input[j];
					input[j] = input[j+1];
					input[j+1] = temp;
				}
			}
			list.add(input[input.length-1-i]);
		}
		return list;
	}

	//2.选择排序
	public static ArrayList<Integer> GetLeastNumber1(int [] input,int k){
		ArrayList<Integer> list = new ArrayList<Integer>();
			if(k>input.length)
				return list;
			
			for(int i =0;i<k;i++){
				for(int j=i+1;j<input.length;j++){ //选择排序
					if(input[i]>input[j]){
						int temp = input[i];
						input[i]=input[j];
						input[j]=temp;
					}
				}
				list.add(input[i]);
			}
			return list;
	} 
	
	//3.堆排序
	public ArrayList<Integer> GetLeastNumber2(int [] input,int k){
		int i;
		ArrayList<Integer> list = new ArrayList<Integer>();
		for(i=input.length/2-1;i>=0;i--){
			adjustHeap(input,i,input.length);
		}
		//以上步骤建堆结束
		//以下开始排序逻辑
		for(i=input.length-1;i>0;i--){
			swap(input,0,i);
			adjustHeap(input,0,i);
		}
		//以上排序结束
		for(i=0;i<k;i++){
			list.add(input[i]);
		}
		return list;
	}
	
	public void adjustHeap(int input[],int p,int N){
		//将N个元素的数组中以input[p]为根的子堆调整为最大堆
		int parent,child;
		int temp = input[p]; //取出根节点存放的值
		for(parent=p;(parent*2+1)<N;parent=child){
			child = 2*parent+1;
			if((child!=N-1)&&(input[child]<input[child+1])){//若child==N-1 那么左节点就是最大值
				child++;  //child指向左右接点较大者
			}
			if(temp>=input[child]) break;
			else  //下滤
				input[parent] = input[child];
		}
		input[parent]=temp;
	}
	
	public void swap(int input[] ,int i,int j){
		int temp = input[i];
		input[i] = input[j];
		input[j] = temp;
	}
	
	//4.快速排序
	public void quickSort(int [] input,int low,int high){
		//递归出口
		if(low>high)
			return;
		int i = low;
		int j = high;
		int key=input[low];
		//完成一趟快排
		while(i<j){
			//从右往左找到第一个小于Key的数
			while(i<j&&input[j]>=key)
				j--;
			//从左往右找到第一个大于key的数(必须要加=)
			while(i<j&&input[i]<=key)
				i++;
			//交换
			if(i<j)
				swap(input,i,j);
		}
		//调整key的位置,交换位置
		input[low]=input[i];
		input[i]=key;
		//递归
		quickSort(input,low,i-1);
		quickSort(input,i+1,high);
	}
	
	//5.插入排序(基本有序,规模较小)
	public void insertSort(int [] array){
		int pos,temp;
		for(int i=1;i<array.length;i++){
			pos=i;
			while(pos!=0&&array[pos]<array[pos-1]){
				temp = array[pos];
				array[pos] = array[pos-1];
				array[pos-1] = temp;
				pos--;
			}
		}
	}
	
	//6.shell排序
	public void shellSort(int [] array){
		int N = array.length;
		//进行分组,最开始时 的增量(gap)为数组长度的一半
		for(int gap = N/2;gap>0;gap/=2){
			//对各个分组进行插入排序
			for(int i=gap;i<N;i++){
				//将array[i]插入到所在分组的正确位置上
				insertI(array,gap,i);
			}
		}
	}
	
	//将array[i]插入到所在分组的正确位置上
	public void insertI(int [] array,int gap,int i){
		int inserted = array[i];
		int j;
		//插入的时候按组进行插入(组内元素两两相隔gap)
		for(j=i-gap;j>0&&inserted<array[j];j-=gap){
			array[j+gap]=array[j];
		}
		array[j+gap]=inserted;
	}
}

你可能感兴趣的:(数据结构)