排序笔记总结

插入排序

直接插入排序

前i个元素是有序的,将第i+1个元素逐个往前比较,比到比一个数大的就插入到这个数后面,即这个数后面的数到i个数全部往后移

例:DS内排—直插排序
题目描述
给定一组数据,使用直插排序完成数据的升序排序。

–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求

输入
数据个数n,n个数据

输出
直插排序的每一趟排序结果

输入样例1
7 34 23 677 2 1 453 3

输出样例1
23 34 677 2 1 453 3
23 34 677 2 1 453 3
2 23 34 677 1 453 3
1 2 23 34 677 453 3
1 2 23 34 453 677 3
1 2 3 23 34 453 677

#include<iostream>
using namespace std;
int main()
{int n;cin>>n;int a[205];//辅助的量a[0]=-99999999;for(int i=1;i<=n;i++) cin>>a[i];//遍历待插入的元素for(int i=2;i<=n;i++){//待插入的元素int x=a[i];//往前比较for(int j=i-1;j>=0;j--){//插入if(x>=a[j]){//后移for(int k=i-1;k>=j+1;k--) a[k+1]=a[k];a[j+1]=x;for(int k=1;k<=n;k++) (k==1)?cout<<a[k]:cout<<" "<<a[k];cout<<endl;break;}}}return 0;
}

折半插入排序

前i个元素是有序的,定义low和high,将第i+1个元素与(low+high)/2进行比较,进行二分查找,直到low=high,然后比较该数与待插入的数,选择插到其前面还是后面

希尔排序

又叫缩小增量排序

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
    通常增量取序列长度除以2,然后每次除以2

例:B. DS排序–希尔排序
题目描述
给出一个数据序列,使用希尔排序算法进行降序排序。
间隔gap使用序列长度循环除2直到1

输入
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推

输出
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。

输入样例1
2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222

输出样例1
444 333 55 111 22 6
444 333 111 55 22 6

444 555 666 2222 77 77 33 1
666 2222 444 555 77 77 33 1
2222 666 555 444 77 77 33 1

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int n;cin>>n;int a[205];memset(a,0,sizeof(a));for(int j=0;j<n;j++) cin>>a[j];//增量int gap=n/2;while(gap){//每组的起始位置for(int j=0;j<gap;j++){for(int k=j;k<n;k+=gap){int big=-99999999;int loc;for(int m=k;m<n;m+=gap){big=max(big,a[m]);if(big==a[m]) loc=m;}swap(a[loc],a[k]);}}for(int j=0;j<n;j++) (j==0)?cout<<a[j]:cout<<" "<<a[j];cout<<endl;//改变增量gap=gap/2;}cout<<endl;}return 0;
}

交换排序

冒泡排序

升序排序时,每次排序,比较两个数将大的数往后,不断操作一次排序就会把最大的元素放在最后,再找第二大的,直到待排序序列只有一个元素

例:C. 冒泡排序
题目描述
给定一个包含从0到n-1各一次的数组,若使用冒泡排序将其排为升序,问其中需要进行多少次交换

输入
测试数据有多组,
每组由两行组成:第一行包含正整数n(n <= 5000); 下一行包含从0到n-1的n个整数的序列。

输出
对于每组测试数据,
输出交换次数

输入样例1
10
1 3 6 9 0 8 5 7 4 2

输出样例1
22

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;//多组输入while(scanf("%d",&n)!=EOF){int a[5005];for(int i=0;i<n;i++) cin>>a[i];int num=0;//待放入元素的地方for(int i=n-1;i>=0;i--){for(int j=0;j<i;j++){if(a[j]>a[j+1]) {swap(a[j],a[j+1]);num++;}}}cout<<num<<endl;}return 0;
}

快速排序

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

具体操作看代码
例:D. DS排序–快速排序
题目描述
给出一个数据序列,使用快速排序算法进行从小到大的排序

–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求

输入
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推

输出
每组测试数据,输出每趟快排的结果,即每次排好一个数字结果(长度为1的子序列,不用排,不用输出)。不同测试数据间用空行分隔。

输入样例1
2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222

输出样例1
55 22 6 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444
6 22 55 111 333 444

1 33 77 555 444 77 666 2222
1 33 77 555 444 77 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222
1 33 77 77 444 555 666 2222

#include<iostream>
using namespace std;
//快排函数
void quicksort(int a[],int left,int right,int n)
{//枢轴量int flag=a[left];int low=left,high=right;while(low<high){//找一个小于枢轴量的数放在这个位置if(a[low]==flag){while(a[high]>=flag&&high>low) high--;if(high==low) break;swap(a[low],a[high]);low++;continue;}//找一个大于枢轴量的数放在这个位置if(a[high]==flag){while(a[low]<=flag&&low<high) low++;if(high==low) break;swap(a[low],a[high]);high--;continue;}}for(int i=0;i<n;i++) (i==0)?cout<<a[i]:cout<<" "<<a[i];cout<<endl;//递归if(high-1-left>=1) quicksort(a,left,high-1,n);if(right-high-1>=1) quicksort(a,high+1,right,n);
}
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int n;cin>>n;int a[205];for(int i=0;i<n;i++) cin>>a[i];//快排quicksort(a,0,n-1,n);cout<<endl;}return 0;
}

选择排序

简单选择排序

若要得到升序,每次从待排序序列中选择一个最小的放在待排序序列的第一个位,待排序序列减小1,直到待排序序列长度为1

例:A. DS排序–简单选择排序
题目描述
给出一个数据序列,使用简单选择排序算法进行升序排序。

输入
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推

输出
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。

输入样例1
2
5
12 58 36 47 96
10
1 3 6 9 0 8 5 7 4 2

输出样例1
12 58 36 47 96
12 36 58 47 96
12 36 47 58 96
12 36 47 58 96

0 3 6 9 1 8 5 7 4 2
0 1 6 9 3 8 5 7 4 2
0 1 2 9 3 8 5 7 4 6
0 1 2 3 9 8 5 7 4 6
0 1 2 3 4 8 5 7 9 6
0 1 2 3 4 5 8 7 9 6
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int n;cin>>n;int a[20005];for(int j=0;j<n;j++) cin>>a[j];//待放入的位置for(int j=0;j<n-1;j++){//选择最小的记录位置int small=a[j];int loc=j;for(int k=j+1;k<n;k++){if(small>a[k]){small=a[k];loc=k;}}swap(a[j],a[loc]);for(int k=0;k<n;k++) (k==0)?cout<<a[k]:cout<<" "<<a[k];cout<<endl;}cout<<endl;}return 0;
}

堆排序

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列。

小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列。

  1. 将待排序序列构造成大顶堆(小顶堆),即先按照索引构造成完全二叉树,然后从最后一个有叶子节点的节点(索引为n/2)开始往前,依次进行筛选操作,即检查是否大于(小于)左右孩子,若不是,则与左右孩子中较大(小)的数交换,继续检查交换后其是否满足,继续筛选
  2. 将大顶堆(小顶堆)的根节点与最后一个节点交换,对交换后的根节点进行筛选操作,此时最后一个节点是已经排好序的,无需算在堆中,重复该步骤

例:B. DS内排—堆排序
题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。

输入
数据个数n,n个整数数据

输出
初始创建的小顶堆序列
每趟交换、筛选后的数据序列,输出格式见样例

输入样例1
8 34 23 677 2 1 453 3 7

输出样例1
8 1 2 3 7 23 453 677 34
8 2 7 3 34 23 453 677 1
8 3 7 453 34 23 677 2 1
8 7 23 453 34 677 3 2 1
8 23 34 453 677 7 3 2 1
8 34 677 453 23 7 3 2 1
8 453 677 34 23 7 3 2 1
8 677 453 34 23 7 3 2 1

#include<bits/stdc++.h>
using namespace std;
struct Node
{int value;Node* left=NULL;Node* right=NULL;
};
//筛选
void choose(Node* node)
{//叶子节点if(!node->left&&!node->right) return ;//左孩子空,右孩子非空else if(!node->left){if(node->value<=node->right->value) return ;else {swap(node->value,node->right->value);//继续筛选choose(node->right);}}//右孩子空,左孩子非空else if(!node->right){if(node->value<=node->left->value) return ;else {swap(node->value,node->left->value);//继续筛选choose(node->left);}}//左右孩子都非空else{if(node->value<=node->left->value&&node->value<=node->right->value) return ;//和更小的交换else{if(node->left->value<=node->right->value){swap(node->value,node->left->value);choose(node->left);}else{swap(node->value,node->right->value);choose(node->right);}}}
}
//打印
void print(Node* node,int n,vector<int> &v)
{cout<<n;queue<Node*> q;q.push(node);while(!q.empty()){Node* no=q.front();q.pop();cout<<" "<<no->value;if(no->left) q.push(no->left);if(no->right) q.push(no->right);}//将已排好序的逆序输出for(int i=v.size()-1;i>=0;i--) cout<<" "<<v[i];cout<<endl;
}
//构建完全二叉树并转化为最小堆
Node* buildTree(int a[],int n,vector<int> &v)
{//根据索引找到节点map<int,Node*> m;int index=1;queue<Node*> q;Node* node=new Node;node->value=a[0];m[0]=node;q.push(node);//构建完全二叉树while(!q.empty()){Node* no=q.front();q.pop();if(index<n){no->left=new Node;no->left->value=a[index++];q.push(no->left);m[index-1]=no->left;}if(index<n){no->right=new Node;no->right->value=a[index++];q.push(no->right);m[index-1]=no->right;}}//最后一个有叶子节点的节点的位置int idx=(n-1)/2;for(int i=idx;i>=0;i--){//筛选操作choose(m[i]);}//打印操作print(node,n,v);return node;
}
//交换操作
void exchange(Node* node,vector<int> &v,int n,int k)
{//即将输出的数的父母索引int idx=k/2;int index=0;//记录待排序堆的最后一个节点Node* last=node;//记录即将输出的数的父母节点Node* par;queue<Node*> q;q.push(node);while(!q.empty()){Node* no=q.front();q.pop();index++;//记录父母节点if(index==idx) par=no;if(no->left) q.push(no->left);if(no->right) q.push(no->right);last=no;}v.push_back(node->value);node->value=last->value;//将最后一个节点置为空if(par->right) par->right=NULL;else par->left=NULL;//筛选choose(node);//打印print(node,n,v);
}
int main()
{int n;cin>>n;int a[205];//放入已排好序的数vector<int> v;for(int i=0;i<n;i++) cin>>a[i];//构建初始堆Node* node=buildTree(a,n,v);//交换操作for(int i=0;i<n-1;i++) exchange(node,v,n,n-i);return 0;
}

归并排序

先分两个数两个数为一组进行排序,再归并两组,即四个数四个数为一组,直到所有数为一组

例:C. DS内排—2-路归并排序
题目描述
输入一组字符串,用2-路归并排序按字典顺序进行降序排序。

输入
测试次数t
每组测试数据:数据个数n,后跟n个字符串,字符串不含空格。

输出
对每组测试数据,输出2-路归并排序的每一趟排序结果。每组测试数据的输出之间有1空行。

输入样例1
2
6 shenzhen beijing guangzhou futian nanshan baoan
10 apple pear peach grape cherry dew fig haw lemon marc

输出样例1
shenzhen beijing guangzhou futian nanshan baoan
shenzhen guangzhou futian beijing nanshan baoan
shenzhen nanshan guangzhou futian beijing baoan

pear apple peach grape dew cherry haw fig marc lemon
pear peach grape apple haw fig dew cherry marc lemon
pear peach haw grape fig dew cherry apple marc lemon
pear peach marc lemon haw grape fig dew cherry apple

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;for(int i=0;i<t;i++){int n;cin>>n;string arr[205];for(int j=0;j<n;j++) cin>>arr[j];//间距for(int j=2;j<n;j*=2){for(int k=0;k<n;k+=j){//降序排序sort(arr+k,arr+k+j,greater<string>());}for(int k=0;k<n;k++) (k==0)?cout<<arr[k]:cout<<" "<<arr[k];cout<<endl;}//最后一次所有数为一组sort(arr,arr+n,greater<string>());for(int k=0;k<n;k++) (k==0)?cout<<arr[k]:cout<<" "<<arr[k];cout<<endl<<endl;}return 0;
}

基数排序

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。
每次进行按照关键字进行筛选再收集起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的测试工具有10类

常用的测试工具有10类&#xff1a; 1.测试管理工具 2.接口测试工具 3.性能测试工具 4.C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app自动化工具 10.web安全测试工具 1.测试管理工具 1&#xff0c;TestDirector(大而全) 2&…

解释RestFUL API,以及如何使用它构建web程序

RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于网络的软件架构风格&#xff0c;用于构建分布式系统。它利用 HTTP 协议中的各种方法&#xff08;如 GET、POST、PUT、DELETE&#xff09;来对资源进行操作&#xff0c;使得不同应用程序能够相互通…

git删除之前上传的

之前文件上传到github上了&#xff0c;但是现在又想要把它删除但是没有找到方法&#xff0c;在网上搜索了很久才找到个有用的。 删除文件 git rm filename git commit -m "删除"但是这时候git push发现没有效果。 之后还要&#xff1a; 清除缓存&#xff1a; gi…

设计模式-多例模式

设计模式专栏 模式介绍多例模式和单例模式的区别应用场景Spring中多例模式的优缺点代码示例Java实现多例模式Python实现多例模式 多例模式在spring中的应用 模式介绍 多例模式是一种创建型设计模式&#xff0c;属于对象创建类型。多例模式的特点是允许一个类有多个实例&#x…

西北大学844计算机类考研-25级初试高分总攻略

西北大学844计算机类考研-25级初试高分攻略 个人介绍 ​ 本人是西北大学22级软件工程研究生&#xff0c;考研专业课129分&#xff0c;过去一年里在各大辅导机构任职&#xff0c;辅导考研学生专业课844&#xff0c;辅导总时长达400小时&#xff0c;辅导学生超过20余人&#xf…

Android集成OpenSSL实现加解密-集成

导入so 将编译生成的 OpenSSL 动态库文件&#xff08;.so 文件&#xff09;复制到你的 Android 项目的 libs 目录中 导入头文件 将编译生成的include文件夹导入到项目中 build.gradle添加配置 defaultConfig {……testInstrumentationRunner "androidx.test.runner…

java对象整理

1.对象的创建过程 首先class文件加载到内存中 这个过程如下 “加载”是“类加载”(Class Loading)过程的第一步。这个加载过程主要就是靠类加载器实现的&#xff0c; 包括用户自定义类加载器。 加载到内存后做的事情 申请对象内存 成员变量赋默认值 调用构造方法 成员变量顺序…

前端实现断点续传文件

公司要求实现的功能&#xff0c;大概思路是将上传的文件通过jsZip压缩后&#xff0c;进行切片&#xff0c;留一下总切片&#xff0c;当前片&#xff0c;并把这些数据给后端&#xff0c;至于前端的校验&#xff0c;是由Md5完成的&#xff0c;验证文件唯一性&#xff0c;这样下次…

什么是受检异常和非受检异常 一、首先是异常的本质 二、然后是对受检异常和非受检异常的定义 三、最后我还可以说下他们优点和缺点) 受检异常优点有两个:

文章目录 什么是受检异常和非受检异常一、首先是异常的本质二、然后是对受检异常和非受检异常的定义三、最后我还可以说下他们优点和缺点&#xff09; 受检异常优点有两个&#xff1a; 什么是受检异常和非受检异常 可以从三个方面回答这个问题一、首先是异常的本质&#xff09…

V-rep(CoppeliaSim)添加相机,与python联合仿真,并使用python读取V-rep中的RGB图与深度图

目录 前言在V-rep中构建场景建立python与V-rep通信 前言 本文主要介绍了如何使用python与V-rep联合仿真&#xff0c;并用OpenCV可视化V-rep中视觉传感器所能看到的 RGB图和深度图&#xff0c;效果图如下。 在V-rep中构建场景 本文使用的V-rep版本是3.5&#xff1a; 打开V-…

react使用useState更新数组失败

失败案例&#xff1a; const [addBox, setAddBox] useState([])const itemAdd (item) >{addBox.push(item);setAddBox(addBox)console.log(addBox,点击添加按钮)} 原因&#xff1a;react的useState hook监听的是浅监听 在 React 中&#xff0c;使用 useState Hook 来更新…

junit.Test 的使用方法

在 Maven 项目中使用 JUnit&#xff0c;你需要在项目的 pom.xml 文件中添加 JUnit 依赖。然后&#xff0c;你可以创建测试类&#xff0c;并在测试类中使用 Test 注解标识测试方法。 文章目录 基本使用其他注解Before 和 AfterBeforeClass 和 AfterClassIgnoreRunWith参数化测试…

C#判断骨龄与生活年龄的比较

什么是骨龄 骨龄是骨骼年龄的简称&#xff0c;它能体现人体生长发育程度。随着生长发育&#xff0c;不同年龄段的骨骺发育成熟度不一样而出现不同的影像特征&#xff0c;是骨龄检测的理论基础。手指腕掌具有20多块骨骼&#xff0c;在各个年龄段具有不同的特点&#xff0c;因而…

009:vue结合el-table实现表格行拖拽排序(基于sortablejs)

文章目录 1. 实现效果2. 安装 sortablejs 插件3. 完整组件代码4. 注意点 1. 实现效果 2. 安装 sortablejs 插件 sortablejs 更多用法 cnpm i --save sortablejs3. 完整组件代码 <template><div class"home"><div class"body"><el-ta…

MongoDB 面试题

MongoDB 面试题 1. 什么是MongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#xff0c;支持动态查询和索引&#xff0c;也支持BSON格式的数据存储&#xff0c;这…

catboost回归自动调参

import os import time import optuna import pandas as pd from catboost import CatBoostRegressor from sklearn.metrics import r2_score, mean_squared_error from sklearn.model_selection import train_test_split X_train data.drop([‘label’, ‘b1’, ‘b2’], a…

探究公有云中的巨人:深入分析大数据产品的架构设计

目录 一、服务器分类 二、公有云基础和产品 网络 vpc专有网络 弹性公网IP(Elastic IP)

3种事件绑定的异同(js的问题)

html事件 dom0事件 dom2事件 • 广义javascript ECMAScript DOM BOM DOM0 DOM1 DOM2 • 狭义javascript ECMAScript ES6 ES5 ES3 事件监听的优点&#xff1a;可以绑定多个事件&#xff0c;常规的事件绑定只执行最后绑定的事件 事件绑定&#xff1a;相当于存储…

从外网访问内网服务器:安装到使用一站通

如果你所在的是一个小的实验室&#xff0c;可能并没有大型的服务器集群而是仅是配备了小型服务器&#xff0c;日常工作便是在在局域网内访问服务器进行各项数据处理。因为在外网无法访问内网服务器&#xff0c;极大的限制了我们偶尔在外想监测一下数据的欲望。本文介绍了一种简…

策略模式(及案例)

策略模式 1.策略接口 定义一组算法或操作的通用接口&#xff0c;通常是一个抽象类或接口。该接口声明了策略类所必须实现的方法。 示例&#xff1a; class Strategy {doOperation() {} }2.具体策略 实现策略接口&#xff0c;提供具体的算法实现。每个具体策略类负责处理一…