當前位置:首頁 » 編程語言 » c語言冒泡演算法

c語言冒泡演算法

發布時間: 2023-01-04 04:08:10

1. c語言冒泡排序法

冒泡排序每一趟排序把最大的放在最右邊。

比如:

87 12 56 45 78

87和12交換:12 87 56 45 78

87和56交換: 56 87 45 78

87和45交換: 45 87 78

87和78交換: 78 87

到此第一趟排序結束,接下來的每一趟排序都是這樣。

#include<stdio.h>
voidPrint(int*num,intn)
{
inti;
for(i=0;i<n;i++)
printf("%d",num[i]);
puts(" ");
return;
}
voidBubble_Sort(int*num,intn)
{
inti,j;
for(i=0;i<n;i++)
{
for(j=0;i+j<n-1;j++)
{
if(num[j]>num[j+1])
{
inttemp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
Print(num,n);
}
}
return;
}
intmain()
{
intnum[8]={87,12,56,45,78};
Bubble_Sort(num,5);
return0;
}

2. C語言簡單冒泡法程序

#include<stdio.h>

voidsort(int*a,intlen)

{inti=0;

intj;

intt;

for(i=0;i<len;i++)

{

for(j=0;j<len-i-1;j++)

{

if(a[j]>a[j+1])

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

}

}

intmain(intargc,char*argv[])

{

inta[10]={

-999,2,3,77,12,88,0,-8,99,100

};

inti=0;

sort(a,10);

for(i=0;i<10;i++)

{

printf("%d",a[i]);

}

return0;

}

(2)c語言冒泡演算法擴展閱讀

冒泡排序法

#include"stdio.h"

voidmain()

{

inta[10];

inti,j,temp;

//輸入10個整型數據

printf("Pleaseinputtennumbers: ");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

//排序

for(i=0;i<9;i++)//10個數,10-1輪冒泡,每一輪都將當前最大的數推到最後

{

for(j=0;j<9-i;j++)//9-i,意思是每當經過一輪冒泡後,就減少一次比較

if(a[j]>a[j+1])

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

//列印排序結果

for(i=0;i<10;i++)

printf("%d ",a[i]);

return0;

}

3. c語言怎麼做冒泡排序啊

使用冒泡排序法進行編程

解釋:

1.第一個for循環:利用數組循環輸入4個變數。

2.第二個for循環:該循環的意思是如果a[0]>a[1]的話,兩個變數的值交換,利用循環依次比較。要注意的是i<3,因為其中有i+1,i最大取到2,也就是i+1最大取到3才正確。

3.第三個for循環:利用循環依次輸出排序後的數組,每輸出一個加一個空格以便於區分。

(3)c語言冒泡演算法擴展閱讀:

冒泡排序法,從數組頭部開始,不斷比較相鄰的兩個元素的大小,通過交換兩個元素的值使較大的元素逐漸往後移動,直到數組的末尾。

經過第一輪的比較,就可以找到最大的元素,並將它移動到最後一個位置。第一輪結束後,繼續第二輪。仍然從數組頭部開始比較,讓較大的元素逐漸往後移動,直到數組的倒數第二個元素為止。

經過第二輪的比較,就可以找到次大的元素,並將它放到倒數第二個位置。

以此類推,進行 n-1(n 為數組長度)輪「冒泡」後,就可以將所有的元素都排列好。

4. c語言冒泡演算法

第二個C語言程序是正確的冒泡程序
因為這兩個C語言程序只有這句不一樣,第一個程序是for(j=0;j<N-i;j++)第二個程序是for(j=0;j<N-i-1;j++)
第一個程序在i=0時,變成for(j=0;j<N;j++),又當j=N-1時,而下面if(a[j+1]<a[j])變成if(a[N]<a[N-1]),a[N]訪問出了數組大小(因為C語言數組元素下標從0到N-1).這在其他語言會出數組越界錯誤.但是C語言不檢查數組越界,所以不會報錯,但是這樣做不安全,有數據溢出的風險.
因此第二個程序是正確的for(j=0;j<N-i-1;j++),在i=0時變成for(j=0;j<N-1;j++)又當j=N-2時下面if(a[j+1]<a[j])變成if(a[N-1]<a[N-2])不會數組越界

5. c語言中冒泡排序的實現原理是什麼

冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重復以上過程,直至最終完成排序。
由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作冒泡排序。
用二重循環實現,外循環變數設為i,內循環變數設為j。外循環重復9次,內循環依次重復9,8,...,1次。每次進行比較的兩個元素都是與內循環j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,...,9,對於每一個i,
j的值依次為1,2,...10-i

6. 用c語言編寫冒泡排序演算法

#include<stdio.h>
void main(){
int i,j,score[10],count=0,temp,sum=0;
double avg;
for(i=0;i<10;i++){ //輸入10個學生的成績,並求著10個學生的成績總和
printf("請輸入第%d個學生的成績:",(i+1));
scanf("%d",&score[i]);
sum+=score[i];
}
avg=sum*1.0/10; //求著這10個學生成績的平均值
for(i=0;i<10;i++){ //統計小於平均分的學生人數
if(score[i]<avg){
count++;
}
}
for(i=0;i<10;i++){ //使用冒泡排序對這10個學生的成績逆序排序
for(j=0;j<9-i;j++){
if(score[j]<score[j+1]){
temp=score[j];
score[j]=score[j+1];
score[j+1]=temp;
}
}
}
printf("最高成績:%d分,平均成績:%.2f分,低於平均成績的人數是:%d人!\n",score[0],avg,count);
}

7. C語言冒泡排序法是怎麼排序的

C語言冒泡排序法的排序規則:

將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

  1. 初始 R[1..n]為無序區。

  2. 第一趟掃描 從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。

    即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。 第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。

  3. 第二趟掃描 掃描R[2..n]。

    掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上…… 最後,經過n-1 趟掃描可得到有序區R[1..n] 注意: 第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。

8. C語言冒泡演算法!!!

冒泡排序的演算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R[i]看作是重量為R[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。

(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。

(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R[i]上,結果是R[1..i]變為新的有序區。

2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程

3、排序演算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的演算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止演算法,不再進行下一趟排序。

(2)具體演算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,採用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序開始前,交換標志應為假
for(j=n-1;j>=i;j--) //對當前無序區R[i..n]自下向上掃描
if(R[j+1].key<R[j].key){//交換記錄
R[0]=R[j+1]; //R[0]不是哨兵,僅做暫存單元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //發生了交換,故將交換標志置為真
}
if(!exchange) //本趟排序未發生交換,提前終止演算法
return;
} //endfor(外循環)
} //BubbleSort
4、演算法分析
(1)演算法的最好時間復雜度
若文件的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:
Cmin=n-1
Mmin=0。
冒泡排序最好的時間復雜度為O(n)。

(2)演算法的最壞時間復雜度
若初始文件是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最壞時間復雜度為O(n2)。

(3)演算法的平均時間復雜度為O(n2)
雖然冒泡排序不一定要進行n-1趟,但由於它的記錄移動次數較多,故平均時間性能比直接插入排序要差得多。

(4)演算法穩定性
冒泡排序是就地排序,且它是穩定的。

5、演算法改進
上述的冒泡排序還可做如下的改進:
(1)記住最後一次交換發生位置lastExchange的冒泡排序
在每趟掃描中,記住最後一次交換發生的位置lastExchange,(該位置之前的相鄰記錄均已有序)。下一趟排序開始時,R[1..lastExchange-1]是有序區,R[lastExchange..n]是無序區。這樣,一趟排序可能使當前有序區擴充多個記錄,從而減少排序的趟數。具體演算法【參見習題】。

(2) 改變掃描方向的冒泡排序
①冒泡排序的不對稱性
能一趟掃描完成排序的情況:
只有最輕的氣泡位於R[n]的位置,其餘的氣泡均已排好序,那麼也只需一趟掃描就可以完成排序。
【例】對初始關鍵字序列12,18,42,44,45,67,94,10就僅需一趟掃描。
需要n-1趟掃描完成排序情況:
當只有最重的氣泡位於R[1]的位置,其餘的氣泡均已排好序時,則仍需做n-1趟掃描才能完成排序。
【例】對初始關鍵字序列:94,10,12,18,42,44,45,67就需七趟掃描。

②造成不對稱性的原因
每趟掃描僅能使最重氣泡"下沉"一個位置,因此使位於頂端的最重氣泡下沉到底部時,需做n-1趟掃描。

③改進不對稱性的方法
在排序過程中交替改變掃描方向,可改進不對稱性。

熱點內容
資料庫組別 發布:2025-07-05 06:15:53 瀏覽:710
我的世界伺服器怎樣設置新手裝備只能拿一次 發布:2025-07-05 06:15:53 瀏覽:985
緩存40集電視劇需要多少流量 發布:2025-07-05 05:56:44 瀏覽:64
iso怎麼解壓到u盤 發布:2025-07-05 05:49:02 瀏覽:890
php參數設置 發布:2025-07-05 05:49:00 瀏覽:995
javacharacter 發布:2025-07-05 05:38:36 瀏覽:735
伺服器pcid地址怎麼看 發布:2025-07-05 05:35:40 瀏覽:384
安卓系統賺錢靠什麼 發布:2025-07-05 05:28:06 瀏覽:159
編譯不出來的原因 發布:2025-07-05 05:14:00 瀏覽:69
絕地求生國際服如何選擇伺服器 發布:2025-07-05 05:08:56 瀏覽:66