1樓:再醉不逍遙
裡面的for迴圈完成一次迴圈,就將最大值轉移到最後,那麼下一次(外面for)就要排除最後已經得到的最大值,在剩下的值中再次得到最大值並轉移到最後。
每一次冒泡後,都要少比較一個資料,比如
4 5 2 1
一次冒泡得 4 2 1 5
二次冒泡得(這時只要遍歷3個 4 2 1 )2 1 4 510-i-1 減去的(i+1)就是已經經過多少次冒泡。
比如第一次 i=0 10-i-1 就為9 那麼迴圈0到9 十個元素 下一次就是9個呢
2樓:
這是因為陣列的序號是從0開始的,而不是從1,你想一想啊,當i=0,即陣列的第一個元素的下標
的值是0,這一點你要非常注意。在氣泡排序中,第一趟是從n個陣列元素中進行
兩兩比較大小,要比較(n-i-1)次,因為i,j是從0開始計數的,所以0,1,2...n-i-2,是不是就是
(n-i-1)次呢,所以是小於(n-i-1)次。
3樓:匿名使用者
這個很好辦,你自己在紙上畫一個陣列,然後自己演算一遍,就知道了。
c語言,氣泡排序那裡,為什麼要定義一個i,一個j他們的用處分別是什麼。還有,j為什麼要=n-1-i
4樓:這個也行服了
冒泡法都是通過兩層迴圈實現,第一層(i)控制趟數,第二層(j)是控制相鄰連個元素比較;
j<(n-1)-i是因為每一趟都能確定一個最大值,所以需要比較的元素就減少了
5樓:匿名使用者
你的問題很古怪,感覺沒有問到點子上,建議你先看演算法原理說明再看程式版,不能先看程式。
定義i、j兩個變數權,是為了對數列進行雙重迴圈操作。
j沒有等於n-1-i,在**中,j
6樓:bboy花小雨
兄弟什麼軟體,這麼6?
7樓:匿名使用者
你**裡不是已經註釋清楚了,i是排序趟次 即做多少趟才能完成冒泡內排序
冒泡法一趟只能找到一個結果(容最大或最小值),放到當前的最後一個位置,所以下一次會少查一個數(n-i-1)
j用來遍歷陣列,相鄰兩個數逐一比較,所以是a[j] 與a[j+1]比較
c語言氣泡排序。
8樓:大野瘦子
#include
void main()
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf(" %d",a[i]);
}氣泡排序演算法的運作
1、比較相鄰的元素。如果第一個比第二個大(小),就交換他們兩個。
2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大(小)的數。
3、針對所有的元素重複以上的步驟,除了最後已經選出的元素(有序)。
4、持續每次對越來越少的元素(無序元素)重複上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。
簡單的表示
#include
void swap(int *i, int *j)int main()
;int i,j;
for (i = 0; i < 10; i++)}}for (i = 0; i < 10; i++)return 0;}
9樓:匿名使用者
//以下以四個數字的給舉例,便於理解;
#include
main()
; //定義陣列,陣列是本次要排序的數字組合;注意此處陣列中一共4個數字所以 理論上是 a[4]=;
//初試化i=1;並判斷i是否小於等於3; 如果符合條件 那麼進入for迴圈;(4個數字,兩兩對比需要進行3輪對比,i就代表了輪數;i需要經過 1,2,3 三輪的賦值;i=4的時候會跳出for迴圈)
for(i=1; i<=3; i++)}}for(i=0; i<4; i++)
}/*執行結果如下:
第 1個數字為:3
第 2個數字為:6
第 3個數字為:10
第 4個數字為:30*/
10樓:鮮日國漢
#include
intmain(void)
;int
t=0;
inti=0,j=0;
for(i=0;i<10;i++)
/*開始冒泡排
序*/for(i=10;i>0;i--)
for(j=0;jnum[j+1])
/*按從小到大*/
}for(i=0;i<10;i++)
/*排序後輸出*/
printf("%d
",num[i]);
getch();
return0;}
11樓:盛京小夥
main() }
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}--------------
冒泡演算法
氣泡排序的演算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:氣泡排序和快速排序。
氣泡排序
1、排序方法
將被排序的記錄陣列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=i;j--) //對當前無序區r[i..
n]自下向上掃描
if(r[j+1].key
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趟掃描。
③改進不對稱性的方法
在排序過程中交替改變掃描方向,可改進不對稱性
複製過來的!
12樓:抗婉竭青
本題的一個完整的c程式如下,程式在win-tc和dev-c++下都除錯通過。
#include
#include
#include
void
bubble_sort(int
array)}}
intmain()
bubble_sort(a);
printf("\n\nthe
sequence
after
sort
is:\n");
for(i=0;i<50;i++)
getch();
/*格式rand()%(m-n+1)+n;產生一個n->m區間的隨機數*/}
13樓:性煥老澹
這是優化後的演算法,如果陣列已有序,則沒有執行到
tag=1;所以退出迴圈,避免做無用功
14樓:碎裂什麼捏
#include
int main()
for(i=1;i<=a;i++) }
}for(i=1;i<=a;i++)
return 0;}
15樓:祖任練易蓉
你的程式裡排序時是按照大數存到低地址,
小數存到高地址,輸出時是先輸出高地址,後輸出低地址,所以輸出的數是升序。而有錯位是因為輸出的格式是一個“%d\t”,未給定數值的位寬。即456佔三個字元,而78是兩個字元。
16樓:哇哎西西
氣泡排序的思想:
首先,從表頭開始往後掃描陣列,在掃描過程中逐對比較相領兩個元素的大小。
若相鄰兩個元素中,前面的元素大於後面的元素,則將它們互換, 稱之為清去了一個逆序。在掃描過程中,不斷地將兩相鄰元素中的大者往後移動,最後就將陣列中的最大者換到了表的最後,這正是陣列中最大元素應有的位置。
然後,在剩下的陣列元素中(n-1個元素)重複上面的過程,將次小元素放到倒數第2個位置。不斷重複上述過程,直到剩下的陣列元素為0為止,此時的陣列就變為了有序。假設陣列元素的個數為西,在最壞情況下需要的比較總次數為:
(n-1)+(n- 2)...+2+1)- n(n-1)/2。
源**如下
冒泡法排序:
#include
int main ()
for (j = 0;j < 9; j++)for (i = 0; i < 9 - j; i++)if (a[i] > a[i+1])
printf ("由小到大的順序為:\n");
for (i = 0; i < 10; i++)printf ("\n");
return 0;
} 執行結果
請輸入十個數:
a[1]=7
a[2]=8
a[3]=9
a[4]=6
a[5]=5
a[6]=4
a[7]=1
a[8]=2
a[9]=3
a[10]=99
由小到大的順序為:
1,2,3,4,5,6,7,8,9,99,
C語言氣泡排序問題,c語言氣泡排序問題!?
文文的鵬鵬 lz的排序方法是錯誤的。比如,輸入8 6 12 0,按照lz的演算法,最終的排序結果是6 8 12 0。lz的演算法只能保證每相鄰的兩個數小在前大在後,但整體結果並不是這樣,所以排序還是要雙重迴圈的。 排序方法挺多的,各有各的優缺點的,有些人只是習慣了用某一個而已。 哈哈,可以用選擇排序...
c語言氣泡排序問題!請高手解決,C語言氣泡排序。
永星天恆 include int main void for i 0 i 5 i printf d a i 輸出排好的數字 printf n return 0 include void maopao int 函式宣告int main void maopao int p include include...
C語言問題求解如圖謝謝為何是三,C語言問題求解如圖謝謝為何這個不用 與號
y冰靨之星 你可能要先理解下 switch a 這個條件是得到a值代入後面滿足條件的case式子計算,再自增。再理解下沒有break的case語句 當case式子之後不帶break的話,該式子及之後所有條件的式子都會被執行 所以程式中的a,b值變化是 a 1,b 0 初始值 a 1,b 1,b 0,...