归并排序+快速排序算法

一、归并排序算法的原理

归并排序是java对象常用的排序方法,其思想使用递归的原理,首先将数组划分为几段已经排序好的子部分,然后两两进行比较,子部分的第一位与第一位比较,谁小将谁放入新数组的第一位,然后取小的子段的第二位与之前较大的第一位比较,以此类推,重复操作,如果最后某个子段较长剩下没有比较的数,则直接放入新的数组。
归并排序示意图
下面展示一些 归并排序代码片

//归并排序法
package arraylist;

public class MergeSort {

	public static void main(String[] args) {
		int[] arr= {2,5,8,9,1,3,4};
		sort(arr,0,arr.length-1);
		print(arr);	
	}	
		public static void sort(int[] arr,int left,int right) {
			if (left==right) return ;
			//分成两半
			int mid=left+(right-left)/2;//为了避免数组较大超出区间
			//左边排序
			sort(arr,left,mid);
			
			//右边排序
			sort(arr,mid+1,right);
			
			merge(arr,left,mid+1,right);
					
		}
	//定义merge方法
		static void merge(int[] arr, int leftPtr,int rightPtr,int rightBounder) {
			int mid=rightPtr-1;
			int temp[]=new int[rightBounder-leftPtr+1];//定义一个新的数组来存放新的排序结果
			
			int i=leftPtr,j=rightPtr,k=0;
			while(i<=mid && j<=rightBounder) {
//				if(arr[i]<=arr[j]) {
//					temp[k++]=arr[i++];
//				}else {
//					temp[k++]=arr[j++];
//				}
				temp[k++]=arr[i]<=arr[j] ? arr[i++]:arr[j++]; 
				
			}
			while(i<=mid) {
				temp[k]=arr[i];
				i++;
				k++;
			}
			while(j<=rightBounder) {
				temp[k++]=arr[j++];
			}
			
			//print(temp);
			for(int m=0;m<temp.length;m++) {
				arr[leftPtr+m]=temp[m];
			}
		}
						
		static void print(int[] arr) {
			for(int i1=0;i1<arr.length;i1++) {
				System.out.print(arr[i1]+"  ");
			}
			
		} 	
}

归并排序分为几个子部分,总共分为***logn***部分,每个部分计算复杂度为***n***,所以整体的时间复杂度为***O(nlogn)***,空间复杂度为***O(n)***,算法是稳定的。

二、快速排序算法的原理

快速排序是首先取定一个数作为轴,将大于轴和小于轴的数分到两边,这个轴的位置不变,然后再取一个数作为轴这样迭代即可。

在这里插入图片描述
下面展示 快速排序代码片

//快速排序法
package arraylist;

public class QuickSort {
	public static void main(String[] args) {
		int[] arr= {7,3,2,6,8,9,6,5,4,6};
		sort(arr,0,arr.length-1);
		print(arr);
		
	}

	public static void sort(int[] arr,int left,int right) {
		if (left>=right) return ;
		
		int mid=partition(arr,left,right);
		sort(arr,left,mid-1);
		sort(arr,mid+1,right);
		
	}
	static int partition(int[] arr,int leftBound,int rightBound) {
		int pivot=arr[rightBound];
		int left=leftBound;
		int right=rightBound-1;
		
		while(left<=right) {//保证只有两个数都可以进行比较,
			while(left<=right && arr[left]<=pivot) left++;
			while(left<=right && arr[right]>pivot) right--;
			if(left<right) swap(arr,left,right);//循环遍历过程中如果大于轴的时候跳出,小于轴的也跳出,将两个位置的值进行交换。
		//	System.out.println("left:"+left+"right:"+right);
		}
		swap(arr,left,rightBound);
		return left;
	}
	
	static void swap(int[] arr,int i,int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;	
		
	}
				
	static void print(int[] arr) {
		for(int i1=0;i1<arr.length;i1++) {
			System.out.print(arr[i1]+"  ");
		}
		
	} 
}

快速排序也是分为几个子部分,总共分为***n***个***logn***部分,所以整体的时间复杂度为***O(nlogn)***,空间复杂度为***O(logn)***,算法是不稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值