Java实现常见排序--希尔排序快排序堆排序归并排序等Java实现代码

Posted Sup_Heaven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现常见排序--希尔排序快排序堆排序归并排序等Java实现代码相关的知识,希望对你有一定的参考价值。

简单插入排序

package lxq.java.sort;

public class InsertSort 
	public static void insertSort(Integer[] arr)
		int i,j;
		for(i=2;i<=arr.length-1;i++)
			//要插入 的元素小于前面最后一个元素,说明当然元素必须插入到前面合适的位置去
			if(arr[i]<arr[i-1])
				arr[0]=arr[i];
				//不需要加j>=1的判断,因为当arr[i]比前面的都小时,最后会比较arr[0]>arr[0]
				for(j=i-1;arr[j]>arr[0];j--)
					arr[j+1]=arr[j];
				
				arr[j+1]=arr[0];
			
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		insertSort(arr);
		System.out.println("插入排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();
	



选择排序

package lxq.java.sort;
//冒泡排序每一次从剩下所有的元素中找出最小的比较
public class SelectionSort 
	public static void selectionSort(Integer[] arr)
		//imin记录最小值,index记录最小值的下标,tmp用于交换的临时变量
		int i,j,imin,index,tmp;
		for(i=1;i<arr.length-1;i++)
			imin=arr[i];
			index=i;
			for(j=i+1;j<=arr.length-1;j++)
				if(arr[j]<imin)
					imin=arr[j];
					index=j;
				
			
			tmp=arr[i];
			arr[i]=arr[index];
			arr[index]=tmp;
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		selectionSort(arr);
		System.out.println("选择排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();
	
	



冒泡排序

package lxq.java.sort;
//冒泡排序每一次只是相邻的两个元素比较,注意j必须从大到小才能保证冒泡
public class BubbleSort 
	public static void bubbleSort(Integer[] arr)
		int i,j,tmp;
		for(i=1;i<arr.length-1;i++)
			for(j=arr.length-1;j>i;j--)
				if(arr[j]<arr[j-1])
					tmp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=tmp;
				
			
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		bubbleSort(arr);
		System.out.println("冒泡排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();
	



希尔排序

package lxq.java.sort;
//希尔排序的一趟排序类似与插入排序,只是增量不一样
public class ShellSort 
	public static void shellSort(Integer[] arr,int dk)
		int i,j;
		for(i=dk+1;i<=arr.length-1;i++)
			//要插入 的元素小于前面最后一个dk元素,说明当然元素必须插入到前面合适的位置去
			if(arr[i]<arr[i-dk])
				arr[0]=arr[i];
				for(j=i-dk;j>=1&&arr[j]>arr[0];j-=dk)
					arr[j+dk]=arr[j];
				
				arr[j+dk]=arr[0];
			
		
	
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		Integer[] dlta=new Integer[]5,3,1;//增量
		for(int i=0;i<dlta.length;i++)
			shellSort(arr,dlta[i]);
		
		System.out.println("希尔排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();

	




快速排序

package lxq.java.sort;

public class QuickSort 
	public static int partition(Integer[] arr,int low,int high)
		arr[0]=arr[low];
		while(low<high)
			while(low<high&&arr[high]>=arr[0])
				high--;
			
			arr[low]=arr[high];
			while(low<high&&arr[low]<=arr[0])
				low++;
			
			arr[high]=arr[low];
		
		arr[low]=arr[0];
		return low;
	
	public static void quickSort(Integer[] arr,int low,int high)
		if(low<high)
			int parloc=partition(arr,low,high);
			quickSort(arr,low,parloc-1);
			quickSort(arr,parloc+1,high);
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		quickSort(arr,1,arr.length-1);
		System.out.println("快速排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();
	
	



归并排序

package lxq.java.sort;

public class MergeSort 
	public static void merge(Integer[] arr,int s,int m,int t)
		int i,j,k;
		Integer[] res=new Integer[t-s+1];//根据arr中要合并的长度申请临时数组的长度
		for(i=s,j=m+1,k=0;i<=m&&j<=t;k++)
			if(arr[i]<arr[j])
				res[k]=arr[i++];
			
			else
				res[k]=arr[j++];
			
		
		while(i<=m)
			res[k]=arr[i++];
			k++;
		
		while(j<=t)
			res[k]=arr[j++];
			k++;
		
		for(k=s;k<=t;k++)//临时数组存放的数据是从0开始的哦
			arr[k]=res[k-s];
		
	
	public static void mergeSort(Integer[] arr,int s,int t)
		if(s==t)
			return;
		
		else
			int m=(s+t)/2;
			mergeSort(arr,s,m);
			mergeSort(arr,m+1,t);
			merge(arr,s,m,t);
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		mergeSort(arr,1,arr.length-1);
		System.out.println("归并排序执行结果如下:");
		for(int i=1;i<=arr.length-1;i++)
			System.out.print(arr[i]+" ");
		
		System.out.println();

	




堆排序

package lxq.java.sort;

public class HeapSort 
	public static void heapAdjust(Integer[] arr,int adjustIndex,int length)
		int adjustValue=arr[adjustIndex];
		int i;
		for(i=2*adjustIndex;i<=length;i*=2)//沿值较小的孩子节点向下筛选
			if(i+1<=length&&arr[i+1]<arr[i]) i++;
			if(adjustValue<=arr[i]) break;//已经符合则退出
			arr[adjustIndex]=arr[i];//将孩子节点的小值赋给父节点,孩子节点的值暂时不变,等到下次孩子节点的孩子节点赋值给它或等到筛选结束时赋值给它
			adjustIndex=i;
		
		arr[adjustIndex]=adjustValue;//在最后的位置上赋值最开始要筛选的值,就完成本次筛选
	
	public static void heapSort(Integer[] arr)
		for(int i=(arr.length-1)/2;i>=1;i--)//把数组arr[1,arr.length-1]建成小顶堆
			heapAdjust(arr,i,arr.length-1);
		
		for(int i=arr.length-1;i>1;i--)
			int tmp=arr[1];//将堆顶记录和当前arr[1,i]中最后一个记录相互交换
			arr[1]=arr[i];
			arr[i]=tmp;
			heapAdjust(arr,1,i-1);//将arr[1,i-1]重新调整为小顶堆,也即对堆顶元素进行一次筛选
		
	
	public static void main(String[] args) 
		//0号位置留作哨兵之用,注意只是数组最大下标为length-1
		Integer[] arr=new Integer[]null,49,38,65,97,76,13,27,49,55,04;
		heapSort(arr);
		System.out.println("堆排序执行结果如下:");
		for(int i=arr.length-1;i>=1;i--)
			System.out.print(arr[i]+" ");
		
		System.out.println();
	






以上是关于Java实现常见排序--希尔排序快排序堆排序归并排序等Java实现代码的主要内容,如果未能解决你的问题,请参考以下文章

校招必看攻略之-Java常见排序算法001之选择排序

8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)

八大经典排序算法

十大排序总结(js实现稳定性内外部排序区别时间空间复杂度冒泡快速直接选择堆直接插入希尔桶基数归并计数排序)

Java中8种常见的排序方法

算法之常见的排序算法