1. 程式人生 > >JAVA實現冒泡、歸併、希爾、堆排、快速、插入、簡單選擇、排序演算法

JAVA實現冒泡、歸併、希爾、堆排、快速、插入、簡單選擇、排序演算法

氣泡排序

public void bubbleSort(int []nums)
	{
		int exchange=nums.length-1;
		while(exchange!=0)
		{
			int bound=exchange;
			exchange=0;
			for(int i=0;i<bound;i++)
			{
				if(nums[i]>nums[i+1])
				{
					int temp=nums[i];
					nums[i]=nums[i+1];
					nums[i+1]=temp;
					exchange=i;
				}
			}
		}
		System.out.println(Arrays.toString(nums));
	}

歸併排序

public  void mergerSort(int[] arr,int low,int high){
		if(low<high){ 
			int mid=(low+high)/2; 
			mergerSort(arr,low,mid);//左邊排序+分解
			mergerSort(arr,mid+1,high);//右邊排序+分解 
			merge(arr,low,mid,high);//合併+排序 
			} 
		}
public  void merge(int[] arr,int low,int mid,int high)//合併 
	{ 
		int i=low;
		int j=mid+1; 
		int k=0;
		int temp[]=new int[high-low+1];//臨時陣列存放元素
		while(i<=mid && j<=high){ 
			if(arr[i]<arr[j])
				temp[k++]=arr[i++];
			else
				temp[k++]=arr[j++]; 
			} 
		while(i<=mid)
			temp[k++]=arr[i++];
		while(j<=high)
			temp[k++]=arr[j++];
		for(int x=0;x<temp.length;x++)
			arr[x+low]=temp[x];
	}

希爾排序

public void shellSort(int []nums)
	{
		for(int d=nums.length/2;d>=1;d=d/2)
		{
			for(int i=d;i<nums.length;i++)
			{
				int target=nums[i];
				int j=i-d;
				for(;j>=0&&nums[j]>target;j-=d)
				{
					nums[j+d]=nums[j];
				}
					nums[j+d]=target;
			}
		}
		System.out.println(Arrays.toString(nums));
	}

堆排

//堆排序
	public void heapSort(int []nums)
	{
		for(int i=nums.length/2-1;i>=0;i--)
			shift(nums,i,nums.length-1);
		for(int j=nums.length-1;j>0;j--)
		{
			int temp=nums[j];
			nums[j]=nums[0];
			nums[0]=temp;
			shift(nums, 0, j-1);
		}
	}
	public void shift(int []nums,int k,int m)
	{
		int i=k;
		int j=2*k+1;
		while(j<=m)
		{
			if(j<m&&nums[j]<nums[j+1])
				j++;
			if(nums[i]>nums[j])
				break;
			else
			{
				int temp=nums[i];
				nums[i]=nums[j];
				nums[j]=temp;
				i=j;
				j=2*i+1;
			}	
		}
	}

快速排序

	//快速排序
    public void quickSort(int []nums,int start,int end)
	{
		if(start<end)
		{
			int pivot=partition(nums,start,end);
			quickSort(nums,start,pivot-1);
			quickSort(nums, pivot+1, end);
		}
	}
	public int partition(int []nums,int i,int j)
	{
		while(i<j)
		{
			while(i<j&&nums[i]<nums[j])
				j--;
			if(i<j)
			{
				int temp=nums[i];
				nums[i]=nums[j];
				nums[j]=temp;
				i++;
			}
			while(i<j&&nums[i]<nums[j])
				i++;
			if(i<j)
			{
				int temp=nums[i];
				nums[i]=nums[j];
				nums[j]=temp;
				j--;
			}
		}
		return i;
	}
	

插入排序

//直接插入排序
	public void insertSort(int []nums)
	{
		
		for(int i=1;i<nums.length;i++)
		{
			int target=nums[i];
			int j=i-1;
			for(;j>=0&&nums[j]>target;j--)
			{
				
				nums[j+1]=nums[j];
			}
			
				nums[j+1]=target;
			
		}
	}
	//最好情況:n-1
	//最壞情況:1,2,...,n-1   n(n-1)/2

簡單選擇排序

public void selectSort(int []nums)
	{
		for(int i=0;i<nums.length;i++)
		{
			for(int j=i;j<nums.length;j++)
			{
				if(nums[j]<nums[i])
				{
					int temp=nums[j];
					nums[j]=nums[i];
					nums[i]=temp;
				}
			}
		}
	}