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

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.kler.cn/news/308018.html

相关文章:

  • linux-硬件与设备管理-硬件信息查看
  • 计算机网络 第3章 数据链路层
  • JS - 获取剪切板内容 Clipboard API
  • 数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)
  • opencv学习:图像直方图均衡化与对比度受限的自适应直方图均衡化及实验代码
  • 针对特定接口记录审核日志类的写入数据库的方法
  • raksmart的G口大流量服务器怎么样?
  • C++学习, 数据抽象
  • 物联网架构
  • 单片机带隙电压基准电路
  • C#环境搭建和入门教程--vs2022之下
  • 51单片机应用开发---数码管的控制应用
  • c++_list
  • 前端开发macbook——NVM环境配置以及git配置流程
  • 《论软件需求管理》写作框架,软考高级系统架构设计师
  • TCP/IP - TCP
  • MySQL5.7基于mysqldump、xtrbackup、innobackupex工具进行全量备份/恢复、增量备份/恢复
  • 【编程基础知识】Java处理JSON格式转换的常用第三方库
  • 面试经典150题——多数元素
  • 表格标记<table>
  • [Linux]:动静态库
  • Python的学习步骤
  • 在docker中安装 zendesk/maxwell 失败,解决方法
  • 51单片机-IIC实验1-AT24C02数据存储(实战1)
  • 5. 理解 Hugging Face 的 AutoModel 系列:不同任务的自动模型加载类
  • git 问题 --- fatal: detected dubious ownership in repository at
  • 停车位检测-停车场车位识别
  • 面试题总结(三) -- 内存管理篇
  • oracle 多表查询
  • MySQL——数据类型(一)