排序算法

哎...很久没有写东西啦,一方面因为自己懒,另一方面最近事情实在是太多。这块毕业啦,忙着找工作,所以把一些基础算法拿出来复习下,在这也记录下,希望能分享给需要的朋友。

一、选择排序和插入排序  最简单的排序方法,时间复杂度O(n2) 空间复杂度 O(1)

class selectSort 
{
	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
		int arr[]={1,4,6,3,2,7,4432,5,2};
		//selectSort(arr);
		insertSort(arr);
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
	}

	//选择排序 时间复杂度 O(n2)  空间复杂度  O(1)
	static void selectSort(int[]arr){
		int len;
		if(arr==null||(len=arr.length)==0)
			return ;
		
		for(int i=0;i<len;i++){
			int big=arr[0];
			int bigIndex=0;
			for(int j=1;j<len-i;j++)
			{
			if(big<arr[j])
				{
					big=arr[j];
					bigIndex=j;
				}
			}
			int temp=arr[len-1-i];
			arr[len-1-i]=big;
			arr[bigIndex]=temp;
		}
	}
	//插入排序
	static void insertSort(int arr[]){
		int len;
		if(arr==null||(len=arr.length)==0)
			return ;

		for(int i=1;i<len;i++){
			int j=i-1;
			int temp=arr[i];
			while(j>=0&&arr[j]>temp){
				arr[j+1]=arr[j];
				j--;
			}
			if(j!=i-1){
				arr[j+1]=temp;
			}
		}
	}

}

二、归并排序

class MergeSort 
{

	static void mergeSort(int data[],int left,int right){
		if(right>left){
			int middle=(left+right)/2;
			mergeSort(data,left,middle);
			mergeSort(data,middle+1,right);
			merge(data,left,middle,right);
		}	
	}

	static void merge(int data[],int left,int middle,int right){
		int lenght=data.length;
		int helper[]=new int[lenght];
		int l=left,r=middle+1,p=left;  //l:合并左边数组的当前位置 r :左边数组当前位置  p:helper当前插入元素到哪个位置
		while(l<=middle&&r<=right){
			if(data[l]>=data[r]){
				helper[p]=data[r];
				r++;
			}else{
				helper[p]=data[l];
				l++;
			}
			//System.out.println(helper[p]);
			p++;
		}

     //之后复制剩余左右数组元素  且只有一边还剩下元素
	 while(l<=middle){
		helper[p]=data[l];
		l++;
		p++;
	 }
	 while(r<=right){
		// System.out.println(r+" "+p);
		helper[p]=data[r];
		r++;
		p++;
	 }
	//之后将helper数组复制回data

	for(int i=left;i<=right;i++){
		data[i]=helper[i];
		
	}
	}
	public static void main(String[] args) 
	{
		int data[]={3,2,55,3,45,243,75,12,999};
		mergeSort(data,0,data.length-1);
		for(int i=0;i<data.length;i++){
			 System.out.println(data[i]);
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值