您的位置:

c语言十种算法,c语言算法概念

本文目录一览:

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 ]); /*显示排序后的结果*/

}