本文目錄一覽:
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