几种排序算法

这篇具有很好参考价值的文章主要介绍了几种排序算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

冒泡排序

冒泡排序的思想

冒泡排序的实现

例题 蓝桥OJ3225 宝藏排序1

 问题描述

输入描述

输出描述

样例输入

样例输出

快速排序

快速排序的思想

快速排序的实现

例题 蓝桥oj 宝藏排序2

 问题描述

输入描述

输出描述

样例输入

样例输出

归并排序

归并排序的思想

归并排序的实现

选择排序

选择排序的思想

选择排序的实现

插入排序

插入排序的思想

插入排序的实现


冒泡排序

冒泡排序的思想

每次将最大的一次一次的运到最右边,然后将最右边这个确定下来。再确定第二大的、第三大的...

对于数组a[],具体来说,每次确定操作就是从左往右扫描,如果a[i]>a[i+1],我们就执行swap(a[i],a[i+1])将两项交换,然后再往右检查,这样可以找出最大的并将其丢到最右边。

第一次确定操作是将a[1]~a[n]中最大的放到a[n];

第二次确定操作是将a[1]~a[n-1]中最大的放到a[n-1];

以此类推,时间复杂对为O(n^2)

由于排序过程中,数字向冒泡泡一样从左往右换过去,故名为冒泡排序

冒泡排序的实现

#include<iostream>
using namespace std;
const int N = 1e3 + 9;
int a[N];
int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; ++i)cin >> a[i];
	//i表示当前要确定的位置
	for (int i = n; i >= 1; --i)
	{
		//j从左往右扫
		for (int j = 1; j <= i - 1; ++j)
		{
			if (a[j] > a[j + 1])swap(a[j], a[j + 1]);
		}
	}
	return 0;
}

例题 蓝桥OJ3225 宝藏排序1

 问题描述

注意:这道题于宝藏排序Ⅰ的区别仅是数据范围

在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队需要将宝藏按照珍贵程度进行排序,以便更好地研究和保护它们。作为探险队的一员,肖恩需要设计合适的排序算法来将宝藏按照珍贵程度进行从小到大排序。请你帮帮肖恩。

输入描述

输入第一行包括一个数字 n ,表示宝藏总共有 n 个。

输入的第二行包括 n 个数字,第 i 个数字 a[i] 表示第 i 个宝藏的珍贵程度。

数据保证 1≤n≤1000,1≤a[i]≤10^6 。

输出描述

输出 n 个数字,为对宝藏按照珍贵程度从小到大排序后的数组。

样例输入

5
1 5 9 3 7

样例输出

1 3 5 7 9
#include <iostream>
using namespace std;
const int N = 1010;
int a[N];
int main()
{
	// 请在此输入您的代码
	int n; cin >> n;
	for (int i = 1; i <= n; ++i)cin >> a[i];
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j < i; j++)
		{
			if (a[i] < a[j])swap(a[i], a[j]);
		}
	}
	for (int i = 1; i <= n; i++)cout << a[i] << ' ';
	return 0;
}

快速排序

快速排序的思想

快速排序是一种基于分治法的排序方法,原理是将一个数组分成两个子数组,其中一个子数组的所有元素都小于另一个子数组的元素,然后递归地对这两个子数组进行排序。

快速排序的思想是通过不断的将数组分成两个子数组,递归的对子数组进行排序,最终得到一个有序的数组。这个过程通过选择合适的基准和分区操作来实现。

快速排序具有更好的时间复杂度O(nlogn),且不需要额外空间。

快速排序的实现

void QuickSort(int a[],int l,int r)
{
    if(l<r)
    {
        int mid = Partition(a,l,r);
        QuickSort(a,l,mid-1);
        QuickSort(a,mid+1,r);
    }
}

这是快速排序的递归主体QuickSort() 传入参数要排序的数组和区间的左右端点

Partition函数会将数组a[l]~a[r]这个区间中某个基准数字放到正确的位置并将这个位置返回

在确定了mid的位置之后,可以保证a[l]~a[mid-1]都<a[mid]<a[mid+1]~a[r],于是只需要将左右两边分别向下递归的排序即可。

 

int partition(int a[], int l, int r)
{
	int pivot = a[r];
	int i = l, j = r;
	while (i < j)
	{
		while (i < j && a[i] <= pivot)i++;
		while (i < j && a[j] >= pivot)j--;
		if (i < j)swap(a[i], a[j]);
		else swap(a[i], a[r]);
	}
	return 0;
}

例题 蓝桥oj 宝藏排序2

 问题描述

注意:这道题于宝藏排序Ⅰ的区别仅是数据范围

在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队需要将宝藏按照珍贵程度进行排序,以便更好地研究和保护它们。作为探险队的一员,肖恩需要设计合适的排序算法来将宝藏按照珍贵程度进行从小到大排序。请你帮帮肖恩。

输入描述

输入第一行包括一个数字 n ,表示宝藏总共有 n 个。

输入的第二行包括 n 个数字,第 i 个数字 a[i] 表示第 i 个宝藏的珍贵程度。

数据保证 1≤n≤10^5,1≤a[i]≤10^9 。

输出描述

输出 nn 个数字,为对宝藏按照珍贵程度从小到大排序后的数组。

样例输入

5
1 5 9 3 7

样例输出

1 3 5 7 9

#include <iostream>
using namespace std;
const int N = 1e5 + 9;
int a[N];

int partition(int a[], int l, int r)
{
	int pivot = a[r], i = l, j = r;
	while (i < j)
	{
		while (i < j && a[i] <= pivot)i++;
		while (i < j && a[j] >= pivot)j--;
		if (i < j)swap(a[i], a[j]);
		else swap(a[i], a[r]);
	}
	return i;
}

void QuickSort(int a[], int l, int r)
{
	if (l < r)
	{
		int mid = partition(a, l, r);
		QuickSort(a, l, mid - 1);
		QuickSort(a, mid + 1, r);
	}
}


int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; ++i)cin >> a[i];
	QuickSort(a, 1, n);

	for (int i = 1; i <= n; ++i)cout << a[i] << " \n"[i == n];
	// 请在此输入您的代码
	return 0;
}

归并排序

归并排序的思想

归并排序基于分治法的排序。

原理是将一个数组分成两个子数组,将子数组向下递归的排序后,得到两个有序数组,然后进行O(n)的合并,最终合并成有序的原数组。

时间复杂度为O(nlogn),但需要额外的空间用于合并数组。

归并排序的实现

void MergeSort(int a[], int l, int r)
{
	if (l == r)return;
	int mid = (l + r) / 2;
	MergeSort(a, l, mid);
	MergeSort(a, mid + 1, r);
	int pl = l, pr = mid + 1, pb = 1;
	while (p1 <= mid || pr <= r)
	{
		if (pl > mid)
		{
			b[pb++] = a[pr++];
		}
		else if (pr > r)
		{
			b[pb++] = a[pl++];
		}
		else
		{
			if (a[pl] > a[pr])b[pb++] = a[pl++];
			else b[pb++] = a[pr++];
		}
	}
	for (int i = l; i <= r; i++)a[i] = b[i];
}

选择排序

选择排序的思想

选择排序的思想和冒泡排序类似,是每次找出最大的然后直接放到右边对应位置,然后将最右边这个确定下来(而不是一个一个地交换过去)。再来确定第二大的,再确定第三大的..

对于数组a[],具体的来说,每次确定操作(假设当前要确定的是i位置)就是从左往右扫描计算出最大元素的下标max_id,最后执行一次swap(a[max_id],a[i])将两项交换即可。

第一次确定操作是将a[1]~a[n]中最大的放到a[n];第二次确定操作是将a[1]~a[n-1]中最大的放到a[n-1]。依此类推,时间复杂度为O(n^2)

选择排序的实现

#include<iostream>
using namespace std;
const int N = 1e3 + 9;
int a[N];
int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = n; i >= 1; i--)
	{
		int max_id = 1;
		for (int j = 1; j <= i; j++)
		{
			if (a[j] > a[max_id])max_id = j;
		}
		swap(a[max_id], a[i]);
	}
	return 0;
}

插入排序

插入排序的思想

插入排序是一种简单直观的排序算法,其基本思想是将待排序的元素逐个插入到已排序序列的合适位置中,使得已排序序列逐渐扩大,从而逐步构建有序序列,最终得到完全有序的序列。
它类似于我们打扑克牌时的排序方式,将一张张牌插入到已经有序的手牌中。
时间复杂度为O(n^2)。文章来源地址https://www.toymoban.com/news/detail-814047.html

插入排序的实现

for (int i = 2; i <= n; ++i)
{
	int val = a[i], j;
	for (j = i; j > 1 && val < a[j - 1]; --j)
	{
		a[j] = a[j - 1];
	}
	a[j] = val;
 }

到了这里,关于几种排序算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】十大经典排序算法-希尔排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 希尔排序是一种插入排序的改进版本,旨在解决插入排序在处理大规模数据时的效率问题。通过将数组分为多个子序列并对

    2024年02月12日
    浏览(56)
  • 【数据结构与算法】十大经典排序算法-插入排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已排好序的有序序列中,直到所有记录

    2024年02月13日
    浏览(60)
  • 【数据结构与算法】十大经典排序算法-快速排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 快速排序(Quick Sort)是一种高效的排序算法,是对冒泡排序的优化。它采用分治法(Divide and Conquer)的思想,将待排序序列

    2024年02月13日
    浏览(47)
  • 【数据结构与算法】十大经典排序算法-冒泡排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌴 掘金 :HelloCode 🌞 知乎 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到

    2024年02月14日
    浏览(53)
  • 数据结构——排序算法之快速排序

        个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想: 任取待排序元素序列中 的某元素作为基准值,按照

    2024年01月21日
    浏览(39)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(50)
  • 数据结构与算法-排序算法

    递归将整个函数的调用过程 调用过程 如何在CSDN博客中插入公式和各种符号 类似二叉树的后续遍历 递归行为和递归行为时间复杂度的估算 master 公式 : T ( n ) = a × T ( n b ) + O ( n d ) T(n) = a times T (frac{n}{b}) + O(n^d) T ( n ) = a × T ( b n ​ ) + O ( n d ) T ( n ) T(n) T ( n ) : 母问题的规模

    2024年02月15日
    浏览(37)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(43)
  • 数据结构与算法—归并排序&计数排序

    目录 一、归并排序 1、主函数 2、递归实现 3、优化递归  4、非递归实现 5、特性总结: 二、计数排序 1、代码: 2、特性总结: 三、各种排序总结 时间空间复杂度汇总  基本思想: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法 的一个非常典型的

    2024年02月04日
    浏览(32)
  • 数据结构与算法:插入排序&希尔排序

    假设现在你有一个有序的数组,你要把一个数据插入到数组中,保证插入后依然有序,要怎么做? 对于人来说,这个问题就像是在整理扑克牌,瞄一眼就知道应该插入什么位置。但是对于程序来说,就需要一一对比,直到找到一个位置 左边比它大,右边比它小 ,就算找到了

    2024年01月17日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包