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 ]); /*顯示排序後的結果*/

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/184492.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-25 17:24
下一篇 2024-11-25 17:24

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論