2020-10-29

数据结构与算法之排序算法(二)

一、归并排序

算法思路:简单来说,就是将一个数组左右分为两半,然后再次细分,逐渐分为两个元素。最后比较大小,然后进行合并。(一般使用递归方法)
在这里插入图片描述

递推公式:
merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))
终止条件:
p >= r 不用再继续分解

代码:

public void MergeSort(int[] a, int n){
	if(n <= 1) return;
	Merger_Sort_c(a, 0, n-1);
}

public void Merger_Sort_c(int[] a, int l, int r){
	if(l >= r) return l;
	int mid = l + ( r - l)/2;
	Merger_Sort_c(a, l, mid);
	Merger_Sort_c(a, mid+1, r);
	mergering(a, l,mid,r);
}

private static void mergering(int[] a, int p, int q, int r) {
int i = p;
int j = q+1;
int k = 0; // 初始化变量i, j, k
int[] tmp = new int[r-p+1]; // 申请一个大小跟a[p...r]一样的临时数组
while (i<=q && j<=r) {
if (a[i] <= a[j]) {
tmp[k++] = a[i++]; // i++等于i:=i+1
} else {
tmp[k++] = a[j++];
}
}
// 判断哪个子数组中有剩余的数据
int start = i;
int end = q;
if (j <= r) {
start = j;
end = r;
}
// 将剩余的数据拷贝到临时数组tmp
while (start <= end) {
tmp[k++] = a[start++];
}
// 将tmp中的数组拷贝回a[p...r]
for (i = 0; i <= r-p; ++i) {
a[p+i] = tmp[i];
}
}

二、快速排序

算法思路:首先选取一个中间点pivot,将这个数组左右元素划分为两个部分,比这个pivot小的部分放在左边,比它大的放在右边。按照上述步骤进行递归。
在这里插入图片描述

递推公式:
quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1… r)
终止条件:
p >= r

public static void QuickSort(int[] a, int n){
	if( n <= 1 )return;
	Q_Sort(a, 0, n-1);
}

public static void Q_Sort(int[] a, int l, int r){
	if(l <= r){
		int pivot = Partition(a, l, r);
		Q_Sort(a, l, pivot)
		Q_Sort(a, pivot+1, r);
	}
}

public static void Partition(int[] a, int l, int r){
	int point = a[r];
	int i = j  = l;
	
	for(; j < r ;j++){
		if(a[j] < point){
			if(i == j){
				++i;
			}else{
				int temp = a[j];
				a[j++] = a[i];
				a[i] = temp;
			}
		}
	}
	
	int m = a[i];
	a[i] = a[r];
	a[r] = m; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值