经典排序算法:快速排序、归并排序、堆排序、选择排序、希尔排序、插入排序、冒泡排序(Java版)


用Java实现经典的排序算法,便于以后查询使用

定义排序类

public class Sort{
	public int[] arr;
	public Sort(int n){
		arr=new int[n];
	}
	public Sort(int[] arr){
		int len=arr.length;
		this.arr=new int[len];
		for(int i=0;i<len;++i){
			this.arr[i]=arr[i];
		}
	}
}

插入排序

//插入排序(小->大)
	public void insertSort(){
		int arrLen=arr.length;
		for(int i=1;i<arrLen;++i){
			int temp=arr[i];
			int j=i-1;
			while(j>=0){
				if(arr[j]<=temp){
					break;
				}
				arr[j+1]=arr[j];
				--j;
			}
			arr[j+1]=temp;
		}
	}

希尔排序

//希尔排序(小->大)
	public void shellSort(int k){
		int arrLen=arr.length;
		while(k>0){
			for(int i=k;i<arrLen;i+=k){
			int temp=arr[i];
			int j=i-k;
			while(j>=0){
				if(arr[j]<temp){
					break;
				}
				arr[j+k]=arr[j];
				j -=k;
			}
			arr[j+k]=temp;
			}
			k /=2;	
		}
	}

选择排序

//选择排序(小->大) 选topK可以用这个
	public void selectSort(){
		int arrLen=arr.length;
		for(int i=0;i<arrLen-1;++i){
			int min=i;
			for(int j=i+1;j<arrLen;++j){
				if(arr[min]>arr[j]){
					min=j;
				}
			}
			if(min!=i){
				int temp=arr[i];
				arr[i]=arr[min];
				arr[min]=temp;
			}
		}	
	}

冒泡排序

//冒泡排序(小->大)
	public void bubbleSort(){
		int arrLen=arr.length;
		for(int i=0;i<arrLen-1;++i){
			for(int j=arrLen-1;j>i;--j){
				if(arr[j]<arr[j-1]){
					int temp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=temp;
				}
			}
		}
	}

快速排序

//快速排序 (小->大)
	public void quickSort(int low, int high){
		if(low<high){
			int privot=arr[low];
			int i=low,j=high;
			while(i<j){
				for(;i<j&&arr[j]>=privot;--j);
				if(i<j){
					arr[i]=arr[j];
					++i;
				}
				for(;i<j&&arr[i]<=privot;++i);
				if(i<j){
					arr[j]=arr[i];
					--j;	
				}
			}
			arr[i]=privot;
			quickSort(low,i-1);
			quickSort(i+1,high);
		}
	}

堆排序

//堆排序(大->小)注意:数组下标从0开始
	// 将节点index放置在堆的合适位置
	private void placeOneNode(int index, int len){
		int i=index;
		int value=arr[i];
		int j=2*i+1;
		if((j+1)<len&&arr[j]>arr[j+1]){
					++j;
				}
		while(j<len&&value>arr[j]){
			arr[i]=arr[j];
			i=j;
			j=2*i+1;
			if((j+1)<len&&arr[j]>arr[j+1]){
				++j;
			}
		}
		arr[i]=value;
	}
	// 建小根堆完全二叉树
	private void buildHeap(){
		int  arrLen=arr.length;
		for(int i=(arrLen/2)-1;i>=0;--i){
			placeOneNode(i,arrLen);
		}
	}
	// 进行推排序
	public void heapSort(){
		buildHeap();
		int  arrLen=arr.length;
		for(int i=arrLen-1;i>0;--i){
			int temp=arr[i];
			arr[i]=arr[0];
			arr[0]=temp;
			placeOneNode(0,i);
		}
	}

归并排序

//归并排序 (小->大)
	public void mergeSort(int low,int high){
		if(low<high){
			int mid=(low+high)/2;
			mergeSort(low,mid);
			mergeSort(mid+1,high);
			merge(low,mid,high);
		}
	}
	// 归并排序合并过程
	private void merge(int low,int mid,int high){
		int i=low,j=mid+1;
		int[] buffer=new int[high-low+1];
		int num=0;
		while(i<=mid&&j<=high){
			if(arr[i]<arr[j]){
				buffer[num++]=arr[i];
				++i;
			}
			else{
				buffer[num++]=arr[j];
				++j;
			}
		}
		while(i<=mid){
			buffer[num++]=arr[i];
			++i;
		}
		while(j<=high){
			buffer[num++]=arr[j];
			++j;
		}
		for(int k=0,s=low;k<num&&s<=high;++k,++s){
			arr[s]=buffer[k];
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值