Java 排序算法练手

package DataStruct;

import java.util.*;

public class Array {
	public static void main(String[] args){
		int[] Data = {6,1,2,7,9,3,4,5,10,8};
		Array test = new Array();
		//test.showSort(Data);
		//test.BubbleSort(Data);//注意是值传递,copy了Data数组的引用,但改变是真实发生的
		//test.ChoiceSort(Data);
		//test.InsertSort(Data);
		//test.FastSort(Data,0,Data.length-1);
		//test.HeapSort(Data);
                //test.MergeSort(Data,0,Data.length-1);
		test.ShellSort(Data);
		test.showSort(Data);
	}
	public void showSort(int[] input){
		//int num = input.length;
		System.out.println(Arrays.toString(input));		
	}
	public void BubbleSort(int[] input){//冒泡排序
		// 时间复杂度 :最坏O(n^2) 最好O(n) 平均O(n^2)
		// 空间复杂度 :O(1)
		// 稳定
		int num = input.length;
		for(int i=1; iinput[j+1]){//前面比后面大则需要进行交换
					exchange(j,j+1,input);
					flag = 1;
				}
			}
			if(flag == 0){//算是一个时间上的优化,但额外申请了一空间
				break;
			}
			//showSort(input);
		}
	}
	public void ChoiceSort(int[] input){//选择排序
		// 时间复杂度 :固定为O(n^2)
		// 空间复杂度 :O(1)
		// 每次只对最值进行交换,算是对冒泡排序的改进
		// 不稳定
		int num = input.length;	
		for(int i=0;iinput[j]){
					min = input[j];
					index = j;
				}
			}//求得min值
			exchange(i,index,input);//每次排序后队首都会新增一个有序数据		
			//showSort(input);
		}
	}
	public void InsertSort(int[] input){//插入排序 (简单直接插入法)(有序情况下O(n)就能解决问题)
		// 时间复杂度 :最坏O(n^2) 平均O(n^2) 最好O(n)
		// 空间复杂度 :O(1)
		// 稳定
		int num = input.length;
		for(int i=1;i0&&temp0){
			if(increment==1)//跳出循环
				break;
			increment = increment/3+1;//终究会等于1的
			//对每个划分使用插入排序,其实就是普通的插入排序法改变比较的间隔
			for(int i=increment;i=0&&temp最好也是O(nlogn)
		// 空间复杂度 :O(logn~n)(有递归栈)
		int temp =start;//设立基准数
		//两个哨兵
		int i = start;
		int j = end;
		if(i==j||jend)return;
		while(i=input[temp]){//找比input[temp]更小的值
				//j先动,这里有个注意点,为什么让j先动
				j--;
			}
			while(istart){//只有存在可分性才能继续往下进行分治
			MergeSort(input, start, mid);
			MergeSort(input, mid+1, end);//不停的划分数组
			MergeHelper(input, start, end, mid);//将两个分数组排序后组合起来
		}
	}
	public void MergeHelper(int[] input, int start, int end, int mid){
		int[] temp = new int[end-start+1];//定义临时数组
		int aNum = start;//前半段
		int bNum = mid+1;//后半段
		int cNum = 0;
		int len1 = mid-start+1;
		int len2 = end-(mid+1)+1;
		while(aNum0;i--){
			exchange(0,i,input);//交换  堆顶数据(max)与堆尾当前最后一个无效数据
			HeapHelper(0,i,input);//调整交换后数据的堆,将下一个max顶至堆头
		}
	}
	public void HeapBuild(int[] input){//建造大顶堆
		for(int i=0;iinput[index]){
				index = left;
			}
			if(rightinput[index]){
				index = right;
			}
			if(index!=i){
				exchange(index,i,input);
			}else
				break;//无需调整则直接退出循环即可
			i = index;
			left = 2*i+1;//左孩子
			right = 2*i+2;//右孩子
		}
	}
}

 

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