最近学了一些最最简单基础的算法
写点东西记录总结一下(因为是业余自学啦,文中有什么错误欢迎大家指正)
简单的排序算法
首先就是大家都非常熟悉的冒泡排序法
该方法是由两个简单的for循环构成,第二层循环是把数组中小的那个数尽量往前推,第一层呢就是总共有多少数,就需要“推进”多少次。
void mopao(int *a,int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=n-1;j>=i;j--)
if(a[j-1]>a[j]) {t=a[j-1]; a[j-1]=a[j]; a[j]=t;}
}
然后是插入排序
插入排序法首先对数组的前两个数进行排序,将第三个数和前两个数进行对比,然后插入合适位置,以此类推,直到把最后一个数插入合适位置。
void charu(int *a,int n)
int i,j,t;
for(i=0;i<n;i++)
{
t=a[i];
j=i-1;
while(j>=0&&t<a[j]) {a[j+1]=a[j]; j--;}
a[j+1]=t;
}
希尔排序
该算法主要思想为分组,然后组内排序,使得数组有序性大大增加,最后通过一次插入排序使得数组成为有序序列。(代码在借用百度的基础上修改了一下)
#include<stdio.h>
#include<math.h>
#define MAXNUM 10
void shellSort(int array[], int n, int t);//t为排序趟数
int main()
{
int array[MAXNUM], i;
for (i = 0;i < MAXNUM;i++)
scanf_s("%d", &array[i]);
shellSort(array, MAXNUM, (int)(log(MAXNUM+1)/log(2)));//排序趟数应为log2(n+1)的整数部分
for (i = 0;i < MAXNUM;i++)
printf("%d ", array[i]);
printf("\n");
return 0;
}
//希尔排序
void shellSort(int array[], int n, int t)
{
int i;
for (i = 1;i <= t;i++)
{
int a,j, temp;
int dk = (int)(pow(2, (double)t - i + 1) - 1);
for (a = dk;a < n;a++)//分别向每组的有序区域插入
{
temp = array[a];
for (j = a - dk; (j >= a % dk) && array[j] > temp; j -= dk)//比较与记录后移同时进行
array[j + dk] = array[j];
if (j != a - dk)
array[j + dk] = temp;//插入
}
}
}
折半查找
折半查找就像在数据两端设置障碍,通过不断缩小障碍的范围提高查找效率。
int isearch(int a[],int n,int x)
{
int mid,low,high;//数组的中间,头,尾;
low=0; high=n-1;//初始化头尾的位置
while(low<=high)
{
mid=(low+high)/2
if(a[mid]==x)
return mid;
else if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
}
求最大值算法
这个就很简单了,用一个临时变量t,将其赋值为第一个元素,然后依次与后面的元素进行比较,若小于后面的数,则赋值为后面面的数。
#include<stdio.h>
void main()
{
int x[10],t,i;
for(i=0;i<10;i++)
{
printf("输入:%d",i+1)
scanf(%d,&x[i]);
}
t=x[0];
for(i=1;i<10;i++)
if(t<x[i]) {t=x[i];}
printf("the max number:%d",t);
}