算法导论(第三版)所有排序算法的实现

本文章代码来自于项目:http://git.oschina.net/jiangkun/Introduction_to_Algorithms-Third_Edition-Answers

欢迎大家一起参与!我会不定时更新!

package acm;

import java.util.Arrays;

public class SortAlgorithms
{
	//插入排序
	public static void InsertionSort(int[] arr)
	{
		int len = arr.length;
		int i,j;
		int key;
		for(j=1;j<len;j++)
		{
			key = arr[j];
			i=j-1;
			while(i>=0 && arr[i]>key)
			{
				arr[i+1]=arr[i];
				i--;
			}
			arr[i+1]=key;
		}
		
	}
	//选择排序
	public static void SelectionSort(int[] arr)
	{
		int len = arr.length;
		int min;
		for(int i=0; i<len-1; i++)
		{
			min=arr[i];
			for(int j=i+1; j<len; j++)
			{
				if(arr[j]<arr[min])
				{
					min = j;
				}
			}
			if(min!=i)
			{
				int t=arr[min];
				arr[min]=arr[i];
				arr[i]=t;
			}
		}
	}
	//归并排序
	public static int[] MergeSort(int arrs[])
	{
		if(arrs.length < 2)
			return arrs;
		int middle = arrs.length/2;
		int[] left = Arrays.copyOfRange(arrs, 0, middle);
		int[] right = Arrays.copyOfRange(arrs, middle, arrs.length);
		int[] lres = MergeSort(left);
		int[] rres = MergeSort(right);
		return merge(lres, rres);
		
	}
	private static int[] merge(int[] lres, int[] rres)
	{
		int[] res = new int[lres.length+rres.length];
		int l=0;
		int r=0;
		int c=0;
		while(l<lres.length && r<rres.length)
		{
			if(lres[l]<rres[r])
				res[c++]=lres[l++];
			else
				res[c++]=rres[r++];
		}
		if(l==lres.length)
		{
			while(r<rres.length)
				res[c++]=rres[r++];
			return res;
		}
		if(r==rres.length)
		{
			while(l<lres.length)
				res[c++]=lres[l++];
			return res;
		}
		return res;
	}
	//冒泡排序
	public static void BubbleSort(int arr[])
	{
		for(int i=0;i<arr.length;i++)
		{
			for(int j=arr.length-1; j>i; j--)
			{
				if(arr[j]<arr[j-1])
				{
					int t=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=t;
					
				}
			}
		}
	}
	//堆排序
	public static void heapSort(int[] arr)	
	{
		int hLen = arr.length;
		int temp;
		buildMaxHeap(arr);
		while(hLen>1)
		{
			temp=arr[hLen-1];
			arr[hLen-1]=arr[0];
			arr[0]=temp;
			hLen--;
			max_heapify(arr, hLen, 0);
		}
	}
	private static void buildMaxHeap(int[] arr)		//从无序数组中构造一个最大堆, n*lgn
	{
		int hLen = arr.length;
		int begin= hLen/2-1;
		for(int i=begin;i>=0;i--)
		{
			max_heapify(arr,hLen, i);
		}
	}
	private static void max_heapify(int[] arr, int hLen, int i)		//用于调整堆,维护最大堆的性质,lgn
	{
		int left = 2*i+1;		//i的左孩子,因为数组中下标是从0开始的
		int right =2*i+2;	//i的右孩子,因为数组中下标是从0开始的
		int largest=i;
		
		if(left<hLen && arr[left]>arr[i])
		{
			largest = left;
		}
		if(right<hLen && arr[right]>arr[largest])
		{
			largest = right;
		}
		if(i!=largest)
		{
			int temp=arr[largest];
			arr[largest]=arr[i];
			arr[i]=temp;
			max_heapify(arr, hLen, largest);
		}		
	}
}


你可能感兴趣的:(java,排序算法)