本文目录一览:
C语言有哪些有名的算法呢?希望可以详细说明下,非常感谢。
排序算法:冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序(这个比较重要)
搜索:深度优先,广度优先
图:Dijkstra算法是典型的单源最短路径算法
树:二叉树
我就知道这些了,应该算比较基本的算法,也比较有名。
C语言排序算法一共多少种
选择排序
#include iostream
using namespace std;
void select_sort(int arr[], int num);
void output_array(int arr[], int num);
int main()
{
int a[10];
for(int i=0; i10; i++)
{
cina[i];
}
select_sort(a,10);
output_array(a,10);
return 0;
}
void select_sort(int array[],int n) //形参array是数组名
{
int i,j,k,t;
for(i=0; in-1; i++)
{
k=i; //先设第i个就为最小
for(j=i+1; jn; j++)
if(array[j]array[k])
k=j; //通过循环,得到k为最小
t=array[k]; //交换a[i]和a[k]
array[k]=array[i];
array[i]=t;
}
return;
}
void output_array(int arr[], int num)
{
int i;
for(i=0; inum; i++)
{
coutarr[i];
coutendl;
}
return;
}
2.冒泡排序
#includestdio.h
int main()
{
int i,j,a[10],t;
for(i=0;i10;i++)
scanf("%d",a[i]);
for(i=0;i10;i++)
for(j=i+1;j10;j++)
if(a[i]a[j])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
for(i=0;i10;i++)
printf("%d ",a[i]);
return 0;
}
3.堆排序
#includeiostream
using namespace std;
void paidui(int a[20],int i,int m)
{
int k,t;
t=a[i];
k=2*i+1;
while (km)
{
if ((km-1)(a[k]a[k+1]))
k++;
if (ta[k])
{
a[i]=a[k];
i=k;
k=2*i+1;
}
else break;
}
a[i]=t;
}
void duipai(int a[20], int n)
{
int i,k;
for (i=n/2-1;i=0;i--)
paidui(a,i,n);
for (i=n-1; i=1; i--)
{
k=a[0];
a[0]=a[i];
a[i]=k;
paidui(a,0,i);
}}
int main()
{
int a[10],i;
for(i=0;i10;i++)
cina[i];
duipai(a,10);
for(i=0;i10;i++)
couta[i]endl;
}
4.快速排序
#includeiostream
using namespace std;
void Quicksort(int a[],int low,int high)
{
if(low=high)
{
return;
}
int first=low;
int last=high;
int key=a[first];
while(firstlast)
{
while(firstlasta[last]=key)
--last;
a[first]=a[last];
while(firstlasta[first]=key)
++first;
a[last]=a[first];
}
a[first]=key;
Quicksort(a,low,first-1);
Quicksort(a,last+1,high);
}
int main()
{
int i,a[100],x,n=0;
while(cinx)
{
a[n]=x;
n++;
}
n--;
Quicksort(a,0,n);
for(i=0;i=n;i++)
couta[i]" ";
coutendl;
return 0;
}
5. 基数排序
#include stdio.h
#include stdlib.h
int main(){
int data[10]={73,22,93,43,55,14,82,65,39,81}; //对十个数进行排序
int temp[10][10]={0}; //构造一个临时二维数组,其值为0
int order[10]={0}; //构造一维数组,其值为0
int i,j,k,n,lsd;
k=0;n=1;
for (i=0;i10;i++) printf("%d ",data[i]); //在排序前,对这10个数打印一遍
putchar('\n');
while (n=10){
for (i=0;i10;i++){
lsd=((data[i]/n)%10); //lsd先对个位取余,然后再对十位取余,注意循环
temp[lsd][order[lsd]]=data[i]; //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯
order[lsd]++; //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
}
printf("\n重新排列: ");
for (i=0;i10;i++){
if(order[i]!=0)
for (j=0;jorder[i];j++){
data[k]=temp[i][j];
printf("%d ",data[k]);
k++;
}
order[i]=0;
}
n*=10; //第二次用十位
k=0;
}
putchar('\n');
printf("\n排序后: ");
for (i=0;i10;i++) printf("%d ",data[i]);
return 0;
}
6.希尔排序
#includeiostream
using namespace std;
void shell_sort(int a[],int n);
int main()
{
int n,a[10000];
cinn;
for(int y=0;yn;y++)
cina[y];
shell_sort(a, n);
for(int i=0; in; i++)
couta[i]" ";
coutendl;
}
void shell_sort(int a[], int n)
{
int gap,k,temp;//定义增量;
for(gap = 3; gap 0; gap--)//设置初始增量,递减;
{
for(int i=0; igap; i++)//按增量分组;
{
for(int j = i+gap; jn; j=j+gap)//每组分别比较大小;
{
if(a[j]a[j-gap])
{
temp = a[j];
k = j-gap;
while(k=0a[k]temp)
{
a[k+gap] = a[k];
k = k-gap;
}
a[k+gap] = temp;
}
}
}
}
}
7.归并排序
#includeiostream
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
int q[100]; //q[100]用来存放排好的序列
int i=s;
int j=m+1;
int k=s;
while(i=mj=t)
{
if(p[i]=p[j])
q[k++]=p[i++];
else
q[k++]=p[j++];
}
if(i=m)
while(i=m)
q[k++]=p[i++];
else while(j=t)
q[k++]=p[j++];
for(int n=s;n=t;n++)
p[n]=q[n];
}
void Merge(int p[],int s,int t)
{
if(st)
{
int m=(s+t)/2; //将数组分成两半
Merge(p,s,m);//递归拆分左数组
Merge(p,m+1,t);//递归拆分右数组
MergeSort(p,s,m,t);//合并数组
}
}
int main()
{
int n;
int p[100];
cinn;
for(int i=0; in; i++)
cinp[i];
Merge(p,0,n-1);
for(int j=0;jn;j++)
coutp[j]" ";
coutendl;
return 0;
}
排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序
求C语言常用经典算法
一个数的各位数之和
#include "stdio.h"
main()
{
int n,sum=0,j;
printf("please input n:\n");
scanf("%d",n);
while(n)
{
j=n%10;
n=n/10;
sum+=j;
}
printf("%d\n",sum);
}
冒泡法排序
#include "stdio.h"
#define MAX 10
int score[MAX];
void bubble()
{
int i,j,tmp;
for(i=0;i=MAX-2;i++)
{
for(j=0;jMAX-i-1;j++)
if(score[j]score[j+1])
{
tmp=score[j];//前后交换//
score[j]=score[j+1];
score[j+1]=tmp;
}
}
}
void main()
{
int i;
printf("please input 10 students score1!\n");
for(i=0;iMAX;i++)
scanf("%d",score[i]);
bubble();
for(i=0;iMAX;i++)
{
printf(" %d",score[i]);
if((i+1)%5==0)
printf("\n");
}
}
阶乘
#include "stdafx.h"
#include "stdio.h"
int main()
{
long n,sum=1,i;
scanf("%d",n);
if(n==0||n==1)
sum=1;
else
for(i=1;i=n;i++)
{
sum*=i;
}
printf("%ld\n",sum);
return 0;
}
杨辉三角
#include "stdio.h"
int main()
{
int i,j,n,k,a[21][21];//数组的大小,为了节约内存空间,最好不要太大。后面的“n”不要超过这个数,这里最好用宏定义//
for(i=0;i20;i++)
{
a[i][0]=1;
a[i][i]=1;
}
printf("please input n:\n");
scanf("%d",n);//n不要超过上面的数组大小//
for(i=1;i=n+1;i++)
{
for(k=1;k=2*(n-i+1);k++)
printf(" ");
for(j=1;ji;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%4d",a[i-2][j-1]);
}
printf("\n");
}
return 0;
}
100--999水仙花数
#include "stdio.h"
int main()
{
int num,a,b,c;
for(num=100;num=999;num++)
{
a=num/100;
b=num/10%10;
c=num%10;
if(a*a*a+b*b*b+c*c*c==num)
printf("%4d\n",num);
}
return 0;
}
判断素数
#include "stdio.h"
#include "math.h"
int main()
{
int n,i;
printf("please input N:\n");
scanf("%d",n);
for(i=2;i=sqrt(n+1);i++)
{
if(n%i==0)
break;
}
if(isqrt(n+1))
printf("%d是素数!\n",n);
else
printf("n不是素数!\n");
return 0;
}
常用的C语言算法有哪些?
数位分离、进制转换、排序(选择\冒泡)、插入、删除、合并、查找、素数、闰年、平年、众多数值计算、链表操作等等。
c语言算法有哪些
这里整理c语言常用算法,主要有:
交换算法
查找最小值算法
冒泡排序
选择排序
插入排序
shell排序 (希尔排序)
归并排序
快速排序
二分查找算法
查找重复算法
C语言算法
冒泡法 5 4 3 2 1
比如上面这5个数字我们把它按照由小到大的顺序排列,
从前往后相临两位比较大小,如果前一位比后一位大就把它俩
换位,5比4大就把5和4换位,得到45321
5又比3大 5和3换位 得到43521 依次类推最后得到
43215 这样就把最大的一个数字移到最后面了
然后不看5 ,剩下4321 再用上面的方法把4移动到最后
得到 32145 在不看45 剩下321 把3移动到
最后,依此类推。
最终得到12345
这就是冒泡法,是计算机编程排序中最简单快捷的方法。
除此以外我还能写出许多排序方法,但是效率上都不如冒泡法
至于为什么叫冒泡法呢,你把这几个数字竖起来看
1
2
3
4
5
把最大的数字5看成最大的泡泡,浮到最上,然后4又浮上去,依此类推
得到
5
4
3
2
1
所以形象的称为冒泡法
——————————————————————————————————
以下是C语言中十个数的冒泡法排序的代码
#includestdio.h
#includeconio.h
int main(void)
{
long array[10],
box=0;
int i1=0,
i2=0;
for(i1=0;i19;i1++)
array[i1]=0;
printf("输入数组元素:\n");
for(i1=0;i1=9;i1++)
{
printf("%3d",i1+1);
scanf("%d",array[i1]);
}
for(i1=0;i1=9;i1++)
for(i2=0;i2=9-i1;i2++)
{
if(arrary[i2]array[i2+1])
{
box=array[i2+1];
array[i2+1]=array[i2];
array[i2]=box;
}
}
printf("\n排序后为:\n");
for(i1=0;i1=9;i1++)
printf("%3d%d\n",i1+1,array[i1]);
getch();
return 0;
}
选择排序法 选择排序法 是对 定位比较交换法 的一种改进。在讲选择排序法之前我们先来了解一下定位比较交换法。为了便于理解,设有10个数分别存在数组元素a[0]~a[9]中。定位比较交换法是由大到小依次定位a[0]~a[9]中恰当的值(和武林大会中的比武差不多),a[9]中放的自然是最小的数。如定位a[0],先假定a[0]中当前值是最大数,a[0]与后面的元素一一比较,如果a[4]更大,则将a[0]、a[4]交换,a[0]已更新再与后面的a[5]~a[9]比较,如果a[8]还要大,则将a[0]、a[8]交换,a[0]又是新数,再与a[9]比较。一轮比完以后,a[0]就是最大的数了,本次比武的武状元诞生了,接下来从a[1]开始,因为状元要休息了,再来一轮a[1]就是次大的数,也就是榜眼,然后从a[2]开始,比出探花,真成比武大会了,当比到a[8]以后,排序就完成了。
下面给大家一个例子:
main()
{
int a[10];
int i,j,t;
for ( i = 0; i 10; i ++ ) scanf("%d",a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i 9; i ++ )
for ( j = i + 1; j 10; j ++)
if ( a[ i ] a[ j ] ) { t = a[ i ]; a[ i ] = a[ j ]; a[ j ] = t; } /*打不过就要让出头把交椅,不过a[ i ]比较爱面子,不好意思见 a[ j ],让t帮忙*/
for( i = 0; i 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}
好啦,啰嗦了半天总算把定位比较排序法讲完了,这个方法不错,容易理解,就是有点麻烦,一把椅子换来换去,哎~
所以就有了下面的选择排序法,开始的时候椅子谁也不给,放在一边让大家看着,找个人k记录比赛结果,然后发椅子。具体来讲呢就是,改进定位比较排序法,但是这个改进只是一部分,比较的次数没变,该怎么打还是怎么打,就是不用换椅子了。每次外循环先将定位元素的小标i值记录到K,认为a[k]是最大元素其实i=k还是a[ i ]最大,a[k]与后面的元素一一比较,该交换的也是也不换,就是把K的值改变一下就完了,最后在把a[k]与a[ i ]交换,这样a就是最大的元素了。然后进入下一轮的比较。选择排序法与定位比较排序法相比较,比的次数没变,交换的次数减少了。
下面也写个例子:
由大到小时:
main()
{
int a[10];
int i,j,t,k;
for ( i = 0; i 10; i ++ ) scanf("%d",a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i 9; i ++ )
{ k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j 10; j ++)
if ( a[ k ] a[ j ] ) k = j;
if (k!=i)
t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; /* t 发放奖品*/
}
for( i = 0; i 10; i ++) printf("%4d",a[ i ]); /*显示排序后的结果*/
}
由小到大时:
main()
{
int a[10];
int i,j,t,k;
for ( i = 0; i 10; i ++ ) scanf("%d",a[ i ]); /*输入10个数,比武报名,报名费用10000¥ ^_^*/
for ( i = 0; i 9; i ++ )
{ k = i; /*裁判AND记者实时追踪报道比赛情况*/
for ( j = i + 1; j 10; j ++)
if ( a[ k ] a[ j ] ) k = j;
if (k!=i)
t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; /* t 发放奖品*/
}
for( i = 9; i = 0; i --) printf("%4d",a[ i ]); /*显示排序后的结果*/
}