ZJNU - 1407 三级排序 && ZJNU - 1399 快速排序-中级

1.题面

acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1407

http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1399

2.题意

题意应该不用讲了,就是排序,一个是整数排序,另一个是将三个坐标按照一定规则排序。

3.解题思路

只是为了测试一下我新写的归并排序,先挂上来

template<typename T>
inline void merge(T *host,T *guest,int len,int wide){
	int l_p,r_p,gst_p;
	int start,mid,end;
	for (start=0;start<len;start=end){
		l_p = gst_p = start;
		r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;
		end = start + wide < len? start + wide: len;
		while (l_p<mid&&r_p<end){
			if (host[l_p]<host[r_p])
				guest[gst_p++] = host[l_p++];
			else 
				guest[gst_p++] = host[r_p++];
		}
		while (l_p<mid)	guest[gst_p++] = host[l_p++];
		while (r_p<end)	guest[gst_p++] = host[r_p++];
	}
}

template<typename T>
void mergesort(T *host,int len){
	T *guest = new T[len];
	for (int wide=1;wide<len;){
		merge(host,guest,len,wide<<=1);
		merge(guest,host,len,wide<<=1);
	}
	delete guest;
}

附加一个带比较器的版本

template<typename T, typename _Compare>
inline void merge(T *host, T *guest, int len, int wide, _Compare comp){
	int l_p,r_p,gst_p;
	int start,mid,end;
	for (start=0;start<len;start=end){
		l_p = gst_p = start;
		r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;
		end = start + wide < len? start + wide: len;
		while (l_p<mid&&r_p<end){
			if (comp(host[l_p],host[r_p]))	guest[gst_p++] = host[l_p++];
			else 	
				guest[gst_p++] = host[r_p++];
		}
		while (l_p<mid)	guest[gst_p++] = host[l_p++];
		while (r_p<end)	guest[gst_p++] = host[r_p++];
	}
}

template<typename T, typename _Compare>
void mergesort(T *host,int len,_Compare comp){
	T *guest = new T[len];
	for (int wide=1;wide<len;){
		merge(host,guest,len,wide<<=1,comp);
		merge(guest,host,len,wide<<=1,comp);
	}
	delete guest;
}


附加一个计算逆序数的版本


/*
 * 计算出 数组中满足 i<j 且 a[i] > a[j] 的数字的个数
 * 注意cmp函数必须这样写
 */

bool cmp(int a,int b){
    return a <= b;
}

template<typename T, typename _Compare>  
inline ll  merge(T *host, T *guest, int len, int wide, _Compare comp){  
    int l_p,r_p,gst_p;  
    int start,mid,end;  
    ll ret = 0;  
    for (start=0;start<len;start=end){  
        l_p = gst_p = start;  
        r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;  
        end = start + wide < len? start + wide: len;  
        while (l_p<mid&&r_p<end){  
            if (comp(host[l_p],host[r_p])){  
                guest[gst_p++] = host[l_p++];  
                ret += r_p - mid;  
            }else {  
                guest[gst_p++] = host[r_p++];  
            }  
        }  
        while (l_p<mid)  {
            guest[gst_p++] = host[l_p++];  
            ret += r_p - mid;
        }
        while (r_p<end){  
            guest[gst_p++] = host[r_p++];  
        }  
    }  
    return ret;  
}  

template<typename T, typename _Compare>  
ll mergesort(T *host,int len,_Compare comp){  
    T *guest = new T[len];  
    ll ret = 0;  
    for (int wide=1;wide<len;){  
        ret += merge(host,guest,len,wide<<=1,comp);  
        ret += merge(guest,host,len,wide<<=1,comp);  
    }  
    delete guest;  
    return ret;  
}  




4.解题代码

暂缺

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值