归并排序和快速排序(小白爱看)

文章提供了两种常见的排序算法——快速排序和归并排序的C++实现模板。快速排序采用分治策略,以第一个元素为基准,将数组分为两部分,然后递归地排序。归并排序同样使用分治,先将数组一分为二,分别排序后再合并。代码可以在洛谷力扣平台上进行测试和训练。
摘要由CSDN通过智能技术生成
//快速排序 模板 
#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int n, q[N];
//(个人)取左边值为 pivot , 将大于 pivot 放在右边, 小于的放在左边 
int part(int q[], int l, int r)
{
	int i = l, j = r, pivot = q[l];
	while(i < j)
	{
		while(i < j && q[j] > pivot)j --;// j -- 目的是找到不满足的 q[j] 
		if (i < j)swap(q[i++],q[j]);// 交换后 j 不动,此时不确定q[i]是否满足 
		while(i < j && q[i] < pivot)i ++;// i ++ 目的是找到不满足的 q[i]
		if (i < j)swap(q[i],q[j--]);// 交换后 i 不动,此时不确定q[j]是否满足 
		//反正就是j -- 就 i ++ ; i ++ 就 j -- 
	}
	return i;
}

void quick_sort(int q[],int l,int r)
{
	int mid;
	if(l < r)
	{
		mid = part(q, l, r);
		quick_sort(q, l, mid-1);// 递归 
		quick_sort(q, mid+1, r);
	}
}

int main()
{
	scanf("%d",&n);
	for (int i = 1;i <= n;i ++) scanf ("%d", &q[i]);
	quick_sort(q, 1, n);
	for (int i = 1;i <= n;i ++) printf ("%d ", q[i]);
	return 0;
} 

// 归并排序 模板 
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int n;
int q[N], a[N];
//  对 A , B 两个数组比大小排序到 a 数组 
void merge(int l, int mid , int r)
{
	int i = l, j = mid + 1, k = l;
	while(i <= mid && j <= r)
	{
		if (q[i] < q[j]) a[k ++] = q[i ++];
		else a[k ++] = q[j ++];
	}
	while (i <= mid) a[k ++] = q[i ++];// A 数组没排序完的继续排序 
	while (j <= r) a[k ++] = q[j ++];// B 数组没排序完的继续排序 
	//for (int i = l;i <= r;i ++) q[i] = a[i];
}
// 将一组数组对半分, 
void merge_sort(int l , int r)
{
	if (l >= r) return ;// 特判 
	int mid = (l + r) / 2;
	merge_sort(l, mid);// A 数组 
	merge_sort(mid + 1, r);// B 数组 
	merge(l, mid, r);
}

int main()
{
	scanf ("%d", &n);
	for (int i = 1;i <= n;i ++) scanf ("%d", &q[i]);
	merge_sort(1, n);
	for (int i = 1;i <= n;i ++) printf ("%d ", a[i]);
	// for (int i = 1;i <= n;i ++) printf ("%d ", q[i]);
	return 0;
}

训练网址:

    【模板】排序 - 洛谷力扣icon-default.png?t=N658https://leetcode.cn/problems/sort-an-array/description/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值