当前位置: 首页 > news >正文

C++数据排序( 附源码 )

一.冒泡排序

原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数.

这样,每一轮结束后,最大/最小的数就会到最后.

Code:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+1;
int n,a[N],in; 
void PrintArray(int a[],int n){
	for(int i=1;i<=n;i++){
		printf("%d ",a[i]);
	} 
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]); 
	}
	for(int i=1;i<=n-1;i++){
		bool flag=true;
		for(int j=1;j<=n-1;j++){
			if(a[j]>a[j+1]) swap(a[j],a[j+1]),flag=false;
		} 
		if(flag) break; 
	} 
	PrintArray(a,n);
	return 0;
}

我在此使用了函数.

二.选择排序

原理:自左向右依次遍历,选出最大/最小数,放到最前/最后

Code:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=1e5+1;
int n,a[N],in; 
void PrintArray(int a[],int n){
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" "; 
	} 
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]); 
	}
	for(int i=1;i<=n-1;i++){
		in=i;
		for(int j=i+1;j<=n;j++){
			if(a[j]<a[in]){
				in=j; 
			}			
		} 
		swap(a[in],a[i]);
	} 
	PrintArray(a,n);
	return 0;
}

函数与双指针搭配,非常好用!

三.桶排序

桶排序是最快的排序.

每个数都对应了一个桶,遍历查找,若有该数,桶为true,最后遍历输出(并无真正排序)

但无法创建过多桶(数组爆炸危机)

Code:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+1;
int n,a[N],t,Max; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&t);
		a[t]=1;
		Max=max(Max,t); 
	} 
	for(int i=1;i<=Max;i++){
		if(a[i]) cout<<i<<" "; 
	} 
	return 0;
}

但如果一个数有两个呢?如:2个2

升级:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+1;
int n,a[N],t,Max; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&t);
		a[t]++;
		Max=max(Max,t); 
	} 
	for(int i=0;i<=Max;i++){
		while(a[i]--) cout<<i<<" "; 
	} 
	return 0;
}

四.插入排序

插入排序,就是你打牌时摸牌并排序啦..

Code:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+1;
int n,a[N],in; 
void PrintArray(int a[],int n){
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" "; 
	} 
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]); 
	}
	for(int i=2;i<=n;i++){
		int in=i-1,now=i;
		while(in>=1 and a[now]<a[in]){
			swap(a[now--],a[in--]);			 
		} 
	} 
	PrintArray(a,n);
	return 0;
}

还有许多排序,等你去探索...

五.归并排序

#include <cstdio>
#include <malloc.h>
 
#define maxn 1000001

int a[maxn];

void Input(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
}

void Output(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        if(i)
            printf(" ");
        printf("%d", a[i]);
    }
    puts("");
}

void MergeSort(int *nums, int l, int r) {
    int i, mid, p, lp, rp;
    int *tmp = (int *)malloc( (r-l+1) * sizeof(int) );    // (1)  
    if(l >= r) {
        return ;                                          // (2) 
    }
    mid = (l + r) >> 1;                                   // (3) 
    MergeSort(nums, l, mid);                              // (4) 
    MergeSort(nums, mid+1, r);                            // (5) 
    p = 0;                                                // (6) 
    lp = l, rp = mid+1;                                   // (7) 
    while(lp <= mid || rp <= r) {                         // (8) 
        if(lp > mid) {
            tmp[p++] = nums[rp++];                        // (9) 
        }else if(rp > r) {
            tmp[p++] = nums[lp++];                        // (10) 
        }else {
            if(nums[lp] <= nums[rp]) {                    // (11) 
                tmp[p++] = nums[lp++];
            }else {
                tmp[p++] = nums[rp++];
            }
        }
    }
    for(i = 0; i < r-l+1; ++i) {
        nums[l+i] = tmp[i];                               // (12) 
    } 
    free(tmp);                                            // (13) 
}

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        Input(n, a);
        MergeSort(a, 0, n-1);
        Output(n, a);
    }
    return 0;
} 

彩蛋:

求一数是否是完全平方数(int范围内)

bool sq(int a){
	return int(sqrt(a))*int(sqrt(a))==a;
} 

需导入cmath头文件!

http://www.dtcms.com/a/109854.html

相关文章:

  • MySQL索引(概念篇)
  • 走向多模态AI之路(二):多模态 AI 如何工作?
  • 0.DJI-PSDK开发准备及资料说明(基于DJI经纬M300RTK和M350RTK无人机上使用)
  • 23种设计模式-行为型模式-责任链
  • sshd -t 命令检查ssh配置文件
  • Zephyr实时操作系统初步介绍
  • shutdown -h now linux关机
  • 供应链管理:计算题 / 倒扣法
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的性能优化:减少启动时间与内存占用
  • LogicFlow获取锚点数据的自定义key并添加的连接的Edge边数据中
  • Linux:进程信号
  • 【编程之路】动态格式化字符串
  • 【堆】《深入剖析优先级队列(堆):数据结构与算法的高效搭档》
  • KUKA机器人查看运行日志的方法
  • Layout Inspector平替跨平台布局分析器のAppium Inspector
  • NineData云原生智能数据管理平台新功能发布|2025年3月版
  • Java学习总结-递归-递归寻找文件绝对路径
  • 全连接RNN反向传播梯度计算
  • RHCSA Linux系统 指令如何使用
  • K8S学习之基础七十四:部署在线书店bookinfo
  • RuoYi-Vue-Plus 安装Minio 实现文件上传
  • 【gdutthesis模板】论文标题太长导致换页问题解决
  • CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景
  • Vue3 Pinia Store使用示例
  • Linux 系统管理综合实训 —— 基于 NAT 模式的多 IP 配置、Nginx 服务部署及存储管理
  • 一周学会Pandas2 Python数据处理与分析-安装Pandas库
  • 在Vue3中格式化后端返回的Java Date类型数据为指定格式
  • 蓝桥杯真题———k倍区间
  • Android开发okhttp添加头部参数
  • 智能建造新范式:装配式建筑 4.0 的数字化进阶