基础组芝士大乱炖2——排序与进制

1.排序

选择排序(包含中间过程)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n = 0,x = 0;
	scanf("%d",&n);
	int a[n];
	for(int i = 0;i < n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i = 0;i < n - 1;i++)
	{
		x = i;
		for(int j = i+1;j < n;j++)//寻找当前最大值
		{
			if(a[x]>a[j])
			{
				x=j;
			}
		}
		swap(a[x],a[i]);//交换最大值当前位置与它应该到的位置(的值)
		for(int i = 0;i < n;i++)//打印中间过程
		{
			printf("%d ",a[i]);
		}
		printf("\n");
	}
	return 0;
}

冒泡排序(想必各位DaLao都会写吧,在此不过多赘述)

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
	int n=0;
	cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
    {
    	cin>>a[i];
	}
	for(int i=1;i<n;i++)
	{
		for(int j=0;j<n-i;j++)
		{
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
			}
		}
		for(int i=0;i<n;i++)
		{
			cout<<a[i] << " ";
		}
		cout<<endl;
	}
    return 0;
}

插入排序

#include<iostream>
#include<math.h>
using namespace std;
int a[10000000] = {0},n = 0;
int main()
{
	cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>a[i];
	}
	for(int i=1;i<n;i++)
    {
    	for(int j=i;j>0;j--)
    	{
    		if(a[j]<a[j-1])
    		{
    			swap(a[j],a[j-1]);//为下一个插入的元素腾位置
			}
			else
			{
				break;//插不动了
			}
		}
		for(int i = 0;i < n;i++)
		{
			printf("%d ",a[i]);
		}
		printf("\n");
	}
    return 0;
}

桶排序(空间换时间,但还是很慢,煎煎蛋蛋,十分粗暴)

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int count[10000000] = {0},maz = 0;
int main()
{
	int n=0,a = 0;
	cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>a;
    	count[a-1]++;
    	maz=max(a,maz);
	}
	for(int i = 0;i < maz;i++)
    {
    	if(count[i])
    	{
    		for(int j = 0;j < count[i];j++)
    		{
    			printf("%d ",i+1);
			}
		}
	}
    return 0;
}

还有快排,希尔等,篇幅原因,不写了

重头戏————SORT!!!

不得不说,sort是真好用,速度比大部分排序算法都快

代码实现

sort(开始下标,结束下标+1(,自定义函数));

2.进制转换

这个其实也蛮简单,就是有点烦人,后面转2进制特别多

code

#include<bits/stdc++.h>

using namespace std;

int a,b;
string num;

int N_zhuan_D(string a,int n)  //n进制转 10进制( n进制数,n) 
{
	int th_num = 0,re_num = 0;  //当前权重 ,当前值, 
	for(int i = 0;i < a.size();i++)  // 
	{
		if(isalpha(a[i]))
			th_num = a[i] - 'A' + 10;
		else
			th_num = a[i] - '0';
		re_num = re_num * n + th_num;
	}
	return re_num;
}

int main()
{
	cin>>a>>num>>b;
	int s = N_zhuan_D(num,a),x = 0,ans = 0; 
	string re_num = "";
	while(s!=0) 
	{
		x = s % b;
		s /= b;
		ans++;
		if(x<10)
			re_num = char('0'+x)+re_num;
		else
			re_num = char('A' + x - 10)+re_num;
	}
	cout<<re_num;
    return 0;
}//我习惯写先转10进制,再转别的

最后

有些DaLao问我有没有题目,我只能说:“有的,兄弟,有的”

果园大比拼 ID:9165
去重排序 ID:9553
有趣的跳跃 ID:9551
数组重排 ID:3304
双调序列 ID:9550
奇葩的排序 ID:3288
32进制数 ID:15841
有问题可以帖子下面发

上一集

下一集

sorry