数据结构+算法
结构:一般表示数据在内存中存储的方式、怎么组织
在内存中数据组织形式
算法:处理问题解决问题的一种思路
学习算法目的:解决性能问题
- 时间 (执行时间)
- 空间 (内存空间)
第一个问题
第k个最大数 :
方法:
冒泡排序:
实现方式通过从第一个数开始和后面进行比较,若大于后面的数则进行交换
我们假设i为大循环,j为里面的小循环
每次小循环都会取到一个最大值并放在最后,而我们取得为j+1所以我们小循环的j不能取到len-1。
但是我们需要从第一个数到最后一个所以大循环要进行len次
#include<stdio.h>
void bubble_sort(int b[],int len)//冒泡排序(数组和长度)
{
//实现方式通过从第一个数开始和后面进行比较,若大于后面的数则进行交换
//我们假设i为大循环,j为里面的小循环
//每次小循环都会取到一个最大值并放在最后,而我们取得为j+1所以我们小循环的j不能取到len-1。
//但是我们需要从第一个数到最后一个所以大循环要进行len次
int t;
for(int i=0;i<len;i++)
{
for(int j=0;j<len-1;j++)
{
if(b[j]>b[j+1])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
}
int main()
{
int n;
int x;
scanf("%d%d",&n,&x);
int a[100]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
bubble_sort(a,n);
printf("升序:");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("第%d最大为%d",x,a[n-x]);
return 0;
}
将k个数当作一个整体:
我们先取k个数然后从k+1个数开始与前面进行比较,如果比那个数大的话就放进取。然后对前k个数在进行冒泡排序。比直接冒泡排序减少了时间。
#include<stdio.h>
int main()
{
int k;
int n;
int t;
scanf("%d%d",&n,&k);
int a[100];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<k;i++)
{
for(int j=0;j<k-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int i=k;i<n;i++)
{
for(int j=0;j<k;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(int i1=0;i1<k;i1++)
{
for(int j1=0;j1<k-1;j1++)
{
if(a[j1]>a[j1+1])
{
t=a[j1];
a[j1]=a[j1+1];
a[j1+1]=t;
}
}
}
}
}
printf("%d",a[0]);
return 0;
}
第二个问题
第二个问题是解决一个流行的字谜。输入是由一些字 母构成的一个二维数组以及一组单词组成。目标是要找出 字谜中的单词,这些单词可能是水平、垂直或沿对角线上 任何方向放置的。
思路:
三元数组进行遍历i,j,k
四元同样遍历i,j,k但是保存字符长度
由此可见:
这些算法如果处理千万数据可能要跑几天。尽管最终结果数据可能正确,但却不切实际。写出一个工作程序并不够。如果这个程序在巨大的数据集上运行,那么运行时间就变成了重要的问题。