算法分析与设计

快速排序和归并排序

快速排序

快排算法属于一种分治的算法,分治算法的基本步骤:

  1. 分成子问题
  2. 递归处理子问题
  3. 子问题合并
    那么我们首先写出快速排序的基本模板(Java)
public void quickSort(int arr[],int lo,int high) {
	if (lo >= high) return;//递归的结束条件
	int x = arr[(lo+high)/2];
	int i = lo-1,j = high+1; //相当于定义两个指针,i从数组头开始匹配,j从数组尾部开始匹配。
	while(i < j) {//数组的匹配逻辑,当i遇到比x大的数停止,j遇到比x小的数停止,之后将两个数交换.这样比X小的数就被放在了X前面,比X大的数放在了后面。
		while(arr[++i] < x);
		while(arr[--j] > x);
		if(i < j) swap(arr[i],arr[j]);
	}
	//递归调用函数,将数组排序。
	quickSort(arr,lo,j);
	quickSort(arr,j+1,high);
}
快速排序需要注意的点

1.在反复理解模板的时候,注意它的递归结束条件,可以是=或>=否则会
陷入死循环。
2.两指针最后应该会相遇,所以递归条件便可以分为[lo,j]和[j+1,high]
两个区间

归并排序

归并排序我最开始是在《算法》的书中看到的,但是说实话,对于上面的代码确实不是很理解。
归并排序我认为是也是分治思想的一种实现,归并排序主要步骤是将数组分为不同的组,之后在归并将其排序。

归并排序模板(Java)
public void mergeSort(int arr[],int lo,int high) {
	if(lo >= high) return;
	int mid = (lo+high)/2;
	mergeSort(arr,lo,mid);
	mergeSort(arr,mid+1,high);
	int i = lo,j = mid+1 ,k = 0,temp[high-lo+1];
	while(i <= mid && j <= high) {
		if (arr[i++] >= arr[j++]) temp[k++] = arr[j];
		else temp[k++] = arr[i]; 
	}
	while (i <= mid) temp[k++] = arr[i++];
	while (j <= high) temp[k++] = arr[j++];
	
	for(i = lo,k = 0;i < high;i++) {
		arr[i] = temp[k++];
	}
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值