超实用的快排、归并排序小模板(建议背会哟)

快速排序模板

快速排序——分治思想

在之前的文章已经介绍了两者的定义及基本思想,可以看这里十大基本排序

下面是排序排序模板的基本步骤和思想。、
|——————————————|
l ---------------------------------------- r
1.确定分界点 q[l],q[(l+r)/2],q[r],随机
【分界点是下标或位置】
2.重新调整区间划分成两部分,将小于等于x的放在前一区间,大于等于x的放在后一区间(重难点)
3.递归处理左右两段,

#include<iostream>

using namespace std;

const int N = 1e6+10;

int n;
int q[N];


//快排模板 
void quick_sort(int q[], int l, int r)
{
	if(l >= r) return;
	int x = q[l + r >> 1], i = l - 1,j = r + 1;
	while(i < j)
	{
		do i++ ; while(q[i] < x);
		do j-- ; while(q[j] > x);
		if(i < j) swap(q[i] , q[j]); //交换两个数
	}
	
	quick_sort(q, l, j);   //取左半段筛选
	quick_sort(q, j+1, r); //取右半段筛选
	//分成两段,继续进行递归 
	
}


int main()
{
	scanf("%d",&n);//输入要排序的数字总数
	for(int i=0; i < n; i++) scanf("%d",&q[i]);
	
	quick_sort(q, 0, n-1);  //整体进行筛选 
	
	for(int i =0; i < n; i++)  printf("%d ",q[i]);
	
	return 0;	
} 

归并排序模板

    left                     right

|———————|———————|

1.确定分界点:mid=(l + r)/2 [分解点是数值]
2.递归排序left、reght
3.归并——合二为一(重难点)

#include<iostream>

using namespace std;

const int N = 1000010;

int n ;
int q[N],temp[N];


void merge_sort(int q[], int l, int r)
{
	if(l >= r)  return;
	
	int mid = l + r >> 1; // 位运算,意为 相加除以2
	
	merge_sort(q, l, mid)//左半边
	merge_sort(q,mid + 1,r);  //右半边
	
	int k = 0, i = l, j = mid + 1;
	while(i <= mid && j <= r)  //均从左边开始遍历
		if(q[i] <= q[j]) temp[k++] = q[i++];
		else temp[k++] = q[j++];
	
	while(i <= mid)  temp[k++] = q[i++];
	while(j <= r)    temp[k++] = q[j++];
	
	for(i = l,j = 0;i <= r;i++,j++) q[i] = temp[j];	//将temp数组复制给q
}

int main()
{
	scanf("%d", &n);
	for(int i = 0; i < n ;i ++)  scanf("%d",&q[i]);
	
	merge_sort(q, 0, n - 1);//归并排序
	
	for(int i = 0; i < n; i ++)  printf("%d ",q[i]);
	
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值