-
這不是冒泡,讓我們給你看乙個。 足以讓你看到:
一點點改進。
#include
void main()
void shift(int *x);
int a[10],*p,i,m;
p=a;for(i=0;i<10;i++)scanf("%d", p++) 輸入數字 10。
scanf("%d",&m);輸入要移動的位數。
p=a;shift(p);
for(i=0;i<10;i++,p++)printf("%d",*p);輸出這 10 位數字。
void shift(int *x)
int m,i,j,t;
for (i=0;i=0;j--) *從第1位到第9位。
x+j+1)=*(x+j);每個位向後移動一位 * x=t; 將第 10 個位置移動到第乙個位置。
-
鼓泡分選步驟如下:
#include
int main()
int a[10]=;
int i=0,j=0,t=0;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
for(j=0;j<10-i;j++)
return 0;}
任意輸入十個資料,程式執行結果:
-
四遍處理(非修飾冒泡測序)。
第一次交換是 2 次。
第一遍:22 小於 94,不交換。
94到17是大交換得到序列22,17,94,125,6394小於125不交換。
125 大於 63 得到序列 22、17、94、63、125 秒:
22 到 17 兌換 17、22、94、63,12522 小於 94 不兌換。
94 大於 63,序列 17、22、63、94、125 第三次交換:很明顯,序列已經按順序排列,不會有交換。
否則,將有第四次比較,同樣沒有交換。
-
共10次加工。
第一次 4 個,第二次 3 個,第三次 2 個,第四次 1 個
每次比較,我交換的金額都超過一定數量。
-
氣泡排序是一種通過以時間換空間進行排序的方法,在最壞的情況下,順序的排列變為相反,或者相反順序的數字序列變為順序。 在這種情況下,每次比較都需要交換運算。 例如,數字 5 4 3 2 1 的序列按冒泡公升序排列,第乙個大迴圈從第乙個數字 (5) 開始,到倒數第二個數字 (2) 結束。
先比較 5 和 4,4 小於 5,交換位置變為 4 5 3 2 1;比較 5 和 3,3 小於 5,交換位置變為 4 3 5 2 1 ......最後,比較 5 和 1,1 小於 5,交換位置變為 4 3 2 1 5。 此時,總共進行了 4 次比較和交換操作,最後 1 個數字成為序列中最大的數字。
第二個迴圈從第乙個數字 (4) 開始,到倒數第三個數字 (2) 結束。 進行了 3 次比較交換操作。
所以比較的總數是 4 + 3 + 2 + 1 = 10 次。
對於一系列 n 位數字,比較次數為 (n-1) +n-2) +1 = n * n - 1) 2,這給出了最大比較次數。
O(n 2) 表示複雜度的數量級。 例如,如果 n = 10000,則 n(n-1) 2 = (n 2 - n) 2 = (100000000 - 10000) 2,與 10 8 相比,10000 可以忽略不計,因此計算的總數約為 * n 2。 O(n 2) 用於表示其數量級(忽略前面的係數)。
-
內層迴圈通過程式並直接結束,外層只迴圈一次。
-
這樣就容易理解了,最好發現第乙個內迴圈沒有交換,說明已經安排好了,不需要進行第二次,最好是o(n),程式會放乙個標誌。
-
我們可以優化氣泡來考慮以下特殊情況,如果原始資料已經下單,計算機不知道它已經下單了。 所以,仍然需要比較,如果沒有發生資料交換,那麼你就知道它已經有序了,你可以做到。 因此,第二次比較還是必要的,第三次和第五次比較是沒有必要的。
我們設定乙個布林變數 bo 來記錄是否存在交換。 值 false 表示交換是在行程中進行的,而 true 則不表示。 **下面:
i:=1; repeat bo:=true; for j:
1 to n-i do if a[j]=temp; bo:=false; end; inc(i); until bo;所以他的複雜性變成了o(n)! 你看,我玩了這麼多,讓我們給出乙個滿意的答案!!
-
46<79 79 位置不變。
79>56 79 倒退。
所以答案是 46 56 64 38 40 79 43 84,現在 79 排在第 6 位。
從 2 點開始
所以答案是最終沉入它的底部 4 分之一。
-
氣泡排序是一種將一組數字逐個排序的方法,具體分為公升序和降序。
以公升序為例。
每次行程的任務是從一組數字的第乙個數字開始,然後依次比較兩個相鄰數字的大小。 既然是公升序,那麼經過比較,如果前者大於後者,那麼兩者互換位置。 就這樣一直持續下去。
在這種情況下,第一次行程將把最大的數字放在最後。
而且每次比較行程,都會排除已經生成的結果,比如第二次行程,就不比較最後乙個數字了(已經是最大的了,當然比較一下就好了,只是浪費時間); 在第三次旅行中,最後兩個數字將不再比較......
每個行程在當前範圍的末尾對最大數字進行排名。
這個迴圈繼續,每次行程都會丟擲當前範圍內的最大數字。 排序完成。
下面是公升序排序的示例:
對於這組數字,第一次跳閘,10比5,10大於5,所以掉倉(5、10、3、11、9),10和3比較,10>3,所以掉期倉位(5、3、10、11、9)、10和11比較,不掉倉; 11與9比較,交換位置(5、3、10、9、11),第一次行程結束;
第二次旅行,因為 11 已經是最大的,所以只剩下了; 5>3,所以交換倉位(3,5,10,9); 5<10、無需互換倉位; 10>9,交換位置(3,5,9,10),第二次行程結束。
第三次旅行,只剩下3<5人,沒有必要交換位置; 5<9,無需交換位置,第三趟行程結束。
第四次行程,左邊,3<5,無需交換位置,第四次行程結束。
這時,由於只剩下兩個數字,這次旅行將兩個數字較高的那個放在了第二位,所以迴圈到此結束。
事實證明。 在這個過程中,每次行程都會把兩個相鄰數字中較大的乙個替換到後面,也就是說,在每次行程中,最大的數字都會被替換到最後,就像乙個氣泡浮出水面,越來越大,當它從水裡出來時,它會是最大的。 這就是為什麼它被稱為氣泡排序。
乙個,555 6666=
二, 5555 66666 = >>>More