首页 > 其他分享 >近似排序......

近似排序......

时间:2024-07-08 15:30:37浏览次数:13  
标签:10 include int ...... 近似 number length 排序

一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......


TFLSOJ【近似排序】

看到题目经简单分析后先写出了一种傻瓜解法,(可能叫 暴力??)

#include<bits/stdc++.h>
using namespace std;
int x,y;
int a[110];
int main(){
	cin>>x>>y;
	for(int i=x,j=1;i<=y;i++,j++){
		a[j]=i;
	}
	for(int i=1;i<=y-x+1;i++){
		for(int j=1;j<=y-x+1;j++){
			if(a[i]%10<a[j]%10)
				swap(a[i],a[j]);
		}
	}
	for(int i=1;i<=y-x+1;i++){
		for(int j=i;j<=(y-x)/10;j++){
			if(a[i]%10==a[j]%10 && a[i]/10>a[j]/10)
			swap(a[i],a[j]);
		}
	}
	for(int i=x,j=1;i<=y;i++,j++){
		cout<<a[j]<<endl;
	}
	return 0;
}

不出所料的:
image
代码中只对每个数的十位和个位做了排序处理,而当数位多的时候就无法处理了。于是想到了通过获取整数的长度来进行磨运算和除运算。


如何获取整数的长度呢?模糊不清的知识点length(),size(),sizeof().......
好像都不能直接获取整数的长度。于是在百般搜索之下AI给出了一段函数:

int getIntegerLength(int number) {
    int length = 0;
    do {
        length++;
        number /= 10;
    } while (number != 0);
    return length;
}

也就是通过一个数不断除以10直到除尽,记录除了几个10。真是个好办法。。。。。
于是就有了以下代码2.0:

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int x,y;
int a[110];
int ll(int number) {
    int l = 0;
    do {
        l++;
        number /= 10;
    } while (number != 0);
    return l;
}
int main(){
	cin>>x>>y;
	for(int i=x,j=1;i<=y;i++,j++){
		a[j]=i;
	}
	for(int i=1;i<=y-x+1;i++){
		for(int j=1;j<=y-x+1;j++){
			int l=pow(10,ll(a[i])-1);
			int lj=pow(10,ll(a[j])-1);
			if(l!=10){
				do{
					l+=(l/10);
				}while(l%100==0);
			}
			if(lj!=10){
				do{
					lj+=(lj/10);
				}while(lj%100==0);
			}
//			cout<<l<<endl<<lj<<endl;
			if(l==lj){
				if(a[i]%l<a[j]%lj)
					swap(a[i],a[j]);
			}
			else{
				if(a[i]%l<(a[j]%(lj*10)))
					swap(a[i],a[j]);
			}
		}
	}
	for(int i=1;i<=y-x+1;i++){
		for(int j=i;j<=(y-x)/(pow(10,ll(a[i])-1));j++){
			int l=pow(10,ll(a[i])-1);
			int lj=pow(10,ll(a[j])-1);
			do{
				l+=(l/10);
			}while(l%10!=0);
			do{
				lj+=(lj/10);
			}while(lj%10!=0);
			if(l==lj){
				if(a[i]/l<a[j]/lj)
					swap(a[i],a[j]);
			}
			else{
				if(a[i]/l<(a[j]/(lj*10)))
					swap(a[i],a[j]);
			}
			swap(a[i],a[j]);
		}
	}
	for(int i=x,j=1;i<=y;i++,j++){
		cout<<a[j]<<endl;
	}
	return 0;
}

不用提交了一个问题引出十个问题,服了。果断看题解。

标签:10,include,int,......,近似,number,length,排序
From: https://www.cnblogs.com/tflsghh/p/18282259

相关文章

  • JS根据json数组多个字段排序及json数组常用操作
    本文转载自:https://www.jb51.net/article/162623.htm js根据json数组多个字段排序的实现代码如下所示:1/**数组根据数组对象中的某个属性值进行排序的方法2*使用例子:newArray.sort(sortByArr(['number'],false))//表示根据number属性降序排列;若第二个参数不传递,默......
  • P1068 [NOIP2009 普及组] 分数线划定【排序】
    [NOIP2009普及组]分数线划定题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150......
  • 【路径规划】基于排序遗传算法求解机器人轨迹优化问题,最佳距离附Matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 拓扑排序,PageRank(markov),实对称矩阵等
    目录拓扑排序  拓扑排序算法:关键路径:DAG最长路给网页排序:pagerank      参考下面的markov链 markov链:转移矩阵A的性质待更新:实对称矩阵的性质:特征值:实对称矩阵一定能分解成AA^T吗?一定可对角化吗?分治与动态规划,递归(关于1子问题)      ......
  • P1093 [NOIP2007 普及组] 奖学金【排序】
    [NOIP2007普及组]奖学金题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都......
  • DAY 1 数据结构与算法 (选择排序,冒泡排序,插入排序)
    1.选择排序        选择排序(SelectionSort)是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选择最小(或最大)的一个元素,放在已排好序的元素序列的末尾,直到全部待排序的数据元素排好序为止。即每一次设定一个数为最大或者最小值,然后与其他的数进行交......
  • C语言实现字符串排序
    如果只有英文字符且不区分大小写的话按照字典序排序可以用strcmp函数,两个字符串自左向右逐个字符相比(按ASCII值大小相比较)strcmp(s1,s2)当s1<s2时,返回为负数;当s1==s2时,返回值=0;当s1>s2时,返回正数。例如"A"<"C"、"d">"D"、"computer">"compare"如果想要不区分大小写的......
  • 冒泡排序
    冒泡排序#include<iostream>usingnamespacestd;voidbubbleSort(intarr[],intn){ boolflag=false;for(inti=0;i<n-1;i++){//外层循环,控制排序的轮数for(intj=0;j<n-i-1;j++){//内层循环,控制每轮比较的次数i......
  • [数据结构] 基于交换的排序 冒泡排序&&快速排序
    标题:[数据结构]基于交换的排序冒泡排序&&快速排序@水墨不写bug(图片来源于网络) 目录(一)冒泡排序优化后实现:(二)快速排序I、实现方法: (1)hoare法hoare法实现快排: (2)挖坑法挖坑法实现:(3)双指针法 双指针法实现:  II、快速排序复杂度分析:比较完备的快速排序实现如......
  • 快速排序的思路及核心函数
    Quick_Sort###思想选取数组段内的任意一个值$x$(可以是左边界值`a[r]`,右边界值`a[l]`,中间值`a[(l+r+1)/2]`)。进行排序,在数组段内,将比$x$小的数都放在$x$的左边,比$x$大的数都放在$x$的右边(双指针)。不断递归处理数组段的左右两段,使得任意一个数的左边都比它小,右边......