aha之排序

桶排序

对n个0-100的数字进行从小到大的排序。

#include<iostream>
int main()
{
    
    
	int a[1001], n, num;
	
	//1.将数组中的值赋值为0
	for(int i=0; i<1001; i++)
		a[i] = 0;
	
	//2.输入数字个数
	scanf("%d", &n); 
	//3.输入n个数字,统计每个数字出现的次数
	for(int i=0; i<n; i++)
	{
    
    
		scanf("%d",&num);
		a[num]++; 
	} 
	
	//4.将数字按照从小到大的顺序及其出现的次数打印出来
	for(int i=0; i<1001; i++)
	{
    
    
		for(int j=1; j<=a[i]; j++)
		{
    
    
			printf("%d ",i);
		}
	} 
	 
	return 0;
} 

结果如下所示:
在这里插入图片描述
桶排序不能解决形如:haha 55, sansha 86, ruyi 97这样带人名的排序。其时间复杂度为O(N+M)。

冒泡排序

冒泡排序弥补了桶排序的不足。其基本思想为:每次比较相邻的两个元素,顺序错误就把它们交换过来。

#include<bits/stdc++.h>
using namespace std;

struct student
{
    
    
	char name[21];
	int score;	
} ;

int main()
{
    
    
	//1.输入元素个数
	int n;
	scanf("%d",&n);
	
	//2.创建具有n+1个元素的结构体数组,输入n个元素 
	struct student a[n+1];
	for(int i=1; i<=n; i++)
	{
    
    
		scanf("%s %d",a[i].name,&a[i].score);	
	} 
	
	//3.对分数进行冒泡排序
	for(int i=1; i<=n; i++)
	{
    
    
		for(int j=1; j<=n-i; j++)
		{
    
    
			if(a[j].score<a[j+1].score)
			{
    
    
				swap(a[j],a[j+1]);
			 } 
		}
	 } 
	 
	//4.输出分数降序排列对应的名字
	for(int i=1; i<=n; i++)
		printf("%s\n",a[i].name);
		
	return 0; 
}

验证如下图:
在这里插入图片描述
冒泡排序的核心是双层嵌套循环。其时间复杂度为:O(N^2)。

快速排序

其平均时间复杂度为0(NlogN)。

#include<iostream>
using namespace std;

int a[101], temp;

void quickSort(int left, int right)
{
    
    
	if(left > right)
		return;
	
	int i=left, j=right;
	temp = a[left];//temp为基准数
	
	while(i!=j)
	{
    
    
		//从右至左寻找小于基准数的数 
		while(a[j]>=temp && i<j)
			j--;
		
		//从左至右寻找大于基准数的数 
		while(a[i]<=temp && i<j)
			i++;
			
		//将大数放在右边,小数放在左边 
		if(i<j)
			swap(a[i],a[j]);
	}
	//当i=j时,交换a[i]与基准数temp的位置 
	a[left] = a[i];
	a[i] = temp;
	//开始子序列的快速排序 
	quickSort(left, i-1);
	quickSort(i+1, right); 
}

int main()
{
    
    
	int n;
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	
	quickSort(1,n);
	
	for(int i=1;i<=n;i++)
		printf("%d ",a[i]);
		
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46161051/article/details/113606557
今日推荐