首页 > 其他分享 >【学习笔记】排序

【学习笔记】排序

时间:2024-01-30 22:56:25浏览次数:28  
标签:int 复杂度 算法 笔记 学习 希尔 排序 插入排序

选择排序

选择排序是一种简单的排序算法。它的原理是每次找到数组中的最小值放到正确的位置。
选择排序的最好、最坏、平均时间复杂度都是 \(O(n^2)\),空间复杂度为 \(O(1)\)。由于存在交换这一操作,选择排序是一个不稳定的排序算法。

void selectionSort(int a[],int n){
	for(int i=1;i<n;i++){
		int minn=i;
		for(int j=i+1;j<=n;j++)
			if(a[j]<a[minn]) minn=j;
		swap(a[i],a[minn]);
	}
}

冒泡排序

冒泡排序是一种简单的排序算法。它的原理是交换相邻元素以消除所有逆序对。
冒泡排序的最好时间复杂度是 \(O(n)\),在数组完全有序的情况下只需遍历一遍而不用交换。最坏时间复杂度和平均时间复杂度都是 \(O(n^2)\),空间复杂度为 \(O(1)\)。由于存在交换这一操作,冒泡排序是一个不稳定的排序算法。

void bubbleSort(int a[],int n){ 
	for(int i=1;i<=n;i++){
		bool flag=true;
		for(int j=1;j<=n-i;j++)
			if(a[j]>a[j+1]){
				swap(a[j],a[j+1]);
				flag=false;
			}
		if(flag) break;
	}
}

插入排序

插入排序是一种简单的排序算法。它的原理是从未排序的部分选择元素插入到已排序元素中正确的位置。
插入排序的最好时间复杂度是 \(O(n)\),在数列相对有序的情况下效率高,而最坏时间复杂度和平均时间复杂度是 \(O(n^2)\),空间复杂度是 \(O(1)\)。插入排序是稳定的排序算法。

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

希尔排序

希尔排序又称缩小增量排序,是插入排序的一种优化版本。希尔排序是一种不稳定的排序算法。
在进行希尔排序的时候,需要进行以下步骤:

  1. 将数组分割成多个子序列,每个元素对应到数组里都相隔一个“增量”。
  2. 对每个子序列进行插入排序。
  3. 缩小增量,重复第一步,直到增量缩小为 1。
    由于插入排序在元素相对有序的情况下效率很高,所以希尔排序的效率相对也比较高。希尔排序的时间复杂度是算不出准确数值的。
    希尔排序的时间复杂度取决于它的增量。它的最好时间复杂度是 \(O(n)\),即不用做任何操作。空间复杂度是 \(O(1)\)。
void shellSort(int a[],int n){
	for(int inc=n/2;inc>=1;inc>>=1)
		for(int i=inc;i<=n;i++){
			int key=a[i];
			int j=i;
			while(j>=inc&&key<a[j-inc]){
				a[j]=a[j-inc];
				j-=inc;
			}
			a[j]=key;
		}
}

标签:int,复杂度,算法,笔记,学习,希尔,排序,插入排序
From: https://www.cnblogs.com/Death-Basic/p/17998159/sorting-algorithms

相关文章

  • 大三寒假学习进度笔记21
    今天看到了一道蓝桥杯的题目,其中使用到了dfs算法,在之前的数据结构中学习过这种算法,但是并没有在代码中使用过,因此根据给出的思路在写了一遍这个题目。#include<bits/stdc++.h>usingnamespacestd;inta[100],ans=0;boolvis[20240000];boolcheck(intdate){if(vis[d......
  • Java 编程指南:入门,语法与学习方法
    Java是什么?Java是一种流行的编程语言,诞生于1995年。由Oracle公司拥有,运行在超过30亿台设备上。Java可以用于:移动应用程序(尤其是Android应用)桌面应用程序网络应用程序网络服务器和应用程序服务器游戏数据库连接等等!为什么使用Java?Java拥有以下优势:跨平......
  • CSAPP学习笔记——chapter5 优化程序性能
    编写高效程序需要做到以下几点:第一,我们必须选择一组适当的算法和数据结构第二,我们必须编写出编译器能够有效优化以转换成高效可执行代码的源代码。对于这第二点,理解优化编译器的能力和局限性是很重要的。编写程序方式中看上去只是一点小小的变动,都会引起编译器优化方式很大的变化......
  • 【侯捷C++面向对象笔记】补充5-new & delete重载
    平时所使用的new和delete操作,称之为表达式,一般由好几个步骤组成。如上图所示,new表达式会被编译器转化为三个步骤。new表达式不能重载,但其中operatornew是可以重载的。➡️全局::operatornew的重载why不能放在namespace内?因为全局operatornew是放在defaultglobalnamespac......
  • openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表
    openGauss学习笔记-211openGauss数据库运维-高危操作一览表各项操作请严格遵守指导书操作,同时避免执行如下高危操作。211.1禁止操作表1中描述在产品的操作与维护阶段,进行日常操作时应注意的严禁操作。表1禁用操作操作名称操作风险严禁修改数据目录下文件名,权限,......
  • 【侯捷C++面向对象笔记】补充2-pointer-like & function-like class
    关键词:仿函数pointer-like:将一个类设计得像指针一样,通常通过重载*和->操作符实现。function-like:将类的成员设计得能像函数一样使用,通过重载()操作符实现。TipDemo应用:智能指针注意:->符号在作用一次后,会继续作用下去(不同于*号)Foof(*sp):f为一个Foo对象本体,使用时f.m......
  • 【侯捷C++面向对象笔记】补充3-template
    关键词:类模板,函数模板,成员模板,模板特化“泛化”和“特化”TipDemo类模板定义时需要显式地指定类型名。函数模板定义时编译器自动进行实参推导类型(但不提供隐式转换)。成员模板:模板中还包含模板模板(全)特化格式:template<>尖括号内为空模板偏特化(partia......
  • 【侯捷C++面向对象笔记】补充4-object model
    关键词:虚函数表,动态绑定,多态每个对象都维护自己的虚表指针,指向类的虚函数表。(所以对象的size比其包含的所有数据size多4,即虚指针大小)➡️动态绑定:(多态的实现原理)通过指针p找到对象c的vptr通过vptr找到classC的vtbl在vtbl中找到第n个虚函数并调用➡️子类调用父类函数隐......
  • 1.业务架构知识学习
    第1章 云商城业务+架构学习和环境准备课程目标1、电商知识学习​ 1).了解电商前景​ 2).掌握电商模式(O2O、C2C、B2B、B2B2C)2、掌握云商城业务场景​ 1).云商城业务介绍​ 2).云商城业务功能学习3、掌握云商城架构设计​ 1).前后端分离开发模式学习​ 2).云商城架构设计......
  • 小书匠发布笔记到博客园
    小书匠发布笔记到博客园小书匠博客园发布要把小书匠里面写的markdown笔记发布到博客园中,需要做如下的设置。一、设置元数据下面是我这个笔记的元数据设置。这里面,title是笔记的标题,tags是笔记的标签,renderNumberedHeading:true表示自动对标题进行编号,grammar_cjkRuby:t......