首页 > 其他分享 >P1177 【模板】排序

P1177 【模板】排序

时间:2024-04-07 22:46:46浏览次数:26  
标签:int mid P1177 数组 排序 模板

P1177 【模板】排序

题目

将读入的 $N$ 个数从小到大排序后输出。

输入

第一行为一个正整数 $N$。

第二行包含 $N$ 个空格隔开的正整数 $a_i$,为你需要进行排序的数。

输出

将给定的 $N$ 个数从小到大输出,数之间空格隔开,行末换行且无空格。

样例

输入

5
4 2 4 5 1

输出

1 2 4 4 5

思路一——分治

代码

#include <bits/stdc++.h>

using namespace std;

int n,a[1000005],b[1000005];

void Merge(int l, int mid, int r)
{
	int i = l, j = mid + 1;
	for (int k = l; k <= r; k ++ )
	{
		if (j > r || (i <= mid && a[i] < a[j]))
			b[k] = a[i ++];
		else
			b[k] = a[j ++];
	}
	for (int k = l; k <= r; k ++ )
		a[k] = b[k];
}

void Msort(int l, int r)
{
	if (l == r)
		return;
	int mid = l + (r - l) / 2;
	Msort(l, mid);
	Msort(mid + 1, r);
	Merge(l, mid, r);
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
		cin >> a[i];
	Msort(1, n);
	for (int i = 1; i <= n; i ++ )
		cout << a[i] << ' ';
	return 0;
}

思路二——快速排序

在数组中选取一个参照值,将比这个值小的元素都转移到数组左侧,比这个值大的转移到数组右侧。

此时数组分为三个部分,将左侧数组和右侧数组作为新数组按照上面的思路进行递归。

代码

#include <bits/stdc++.h>

using namespace std;

int n, a[100005];

void qsort(int l, int r)
{
	int mid = a[l + (r - l) / 2]; // 将数组分成两部分,取中间数做参照数
	int i = l, j = r; // 从两个子数组的两端开始与参数数对比
	while (i <= j)
	{
		while (a[i] < mid)
			i ++; // 找到左边大于等于 mid 的数
		while (a[j] > mid)
			j --;//找到右边小于等于 mid 的数
		if (i <= j) // 交换两个数
		{
			swap(a[i], a[j]);
			i ++;
			j --;
		}
	} // 完成已 mid 为参照,保证左区间的数 < mid < 右区间的数
	if (l < j)
		qsort(l,j); // 继续分治,将左区间递归处理
	if (i < r)
		qsort(i,r); // 将右区间递归处理
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
		cin >> a[i];
	qsort(1, n);
	for (int i = 1; i <= n; i ++ )
		cout << a[i] << ' ';
	return 0;
}

标签:int,mid,P1177,数组,排序,模板
From: https://www.cnblogs.com/IronMan-PZX/p/18120090

相关文章

  • P1883 【模板】三分 | 函数
    原题链接题解1.首先,\(F(x)\)图像一定是下凹的,怎么证明我也不知道,只是感觉是这样2.既然是下凹的,那么一定有最小值,区间内找极大值/极小值可以用三分B站有个视频直观地讲解了,一看便知还有一些小细节,请看讨论区code#include<bits/stdc++.h>usingnamespacestd;constint......
  • 分治思想排序(快速排序、归并排序)
    分治:分而治之,即把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并优点:降低时间复杂度:分治法可以将大问题分解为小问题,通过解决小问题来有效解决原问题,从而降低算法的时间复杂......
  • 排序算法——快速排序
    问题描述 现有一组数据:23,45,18,11,13,79,72,25,3,17,请使用快速排序算法将它们按照从小到大的顺序排列。算法思想(1)在无序数据中选一个基准数(通常为数据第一个);(2)将数据中小于基准数的数据移到基准数左边,大于基准数的移到右边;(3)对于基准数左、右两边的数据,不断重复以上两个......
  • Stream流sorted的多级排序问题(巨坑)
    https://blog.csdn.net/qq_28165595/article/details/131152763 前言之前在给一个List集合中对象进行多属性排序,比如先根据对象中的A属性正序排序,若两个对象的A属性值相同,再根据对象的B属性进行正序排序。这种排序在实际开发中比较常见,但是这里面有个坑。举个例子先初始化一个......
  • 自定义排序
    问题:按照A列的排序依据进行排序函数公式:=SORTBY(C2:D8,MATCH(C2:C8,A2:A8,))自定义序列排序:设置自定义序列(如需要): 选取A2:A8》文件》选项》自定义序列》导入自定义排序:选取数据》数据》排序》自定义排序……次序设置为自定义序列......
  • 常见的排序算法——插入排序
    本文记述了插入排序的基本思想和一份参考实现代码,并在说明了算法的性能后用实验进行了验证。◆思想将第一个元素之后的所有元素作为待排序范围,将前面的所有元素作为已排序范围。通过一一比较,逐个交换已排序范围内比第二个元素大的所有元素,使第二个元素被插入到了正确的位置。然......
  • MySQL多表联合查询+分组+排序
    DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(......
  • 数据结构 第八章(排序算法)【上】
    写在前面:本系列笔记主要以《数据结构(C语言版)》为参考(本章部分图片来源于王道),结合下方视频教程对数据结构的相关知识点进行梳理。所有代码块使用的都是C语言,如有错误欢迎指出。视频链接:第01周a--前言_哔哩哔哩_bilibili基数排序部分的代码参考了一位小伙伴分享的代码,特此说明一......
  • 堆排序算法
    问题描述现有一组数据:23,45,18,11,13,79,72,25,3,17。请使用快速排序算法将它们按照从小到大的顺序排列。算法思想(1)将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;(2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(3)重新调整结构,使其满足堆定义,然后继续......
  • 单链表的冒泡,选择和快速排序
    单链表的冒泡,选择和快速排序选择排序选择排序的原理是在每一趟遍历时找出所有数据中最小或者最大的那一个值,然后放到开头或者末尾,在链表里面也是同样的道理,在下面的代码当中,遍历了一遍链表之后,我们找出了最大的那个值,然后用头插法插入链表的开头,关键的地方是链表不能查找......