1樓:匿名使用者
(1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:
每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
(2)例項:
(3)**解釋:
#include
int main()
for (j=1;j<=9;j++)}}
for (i=0;i<=9;i++)
return 0;
}望採納!
2樓:厚脂肪肥大
#include
int main()
for (j=1;j<=9;j++) //j從1到10迴圈}}
for (i=0;i<=9;i++) //輸出排序後的數字
return 0;
}第一次迴圈j=0 t=9 裡迴圈i從0到9將最大的數換到a[9];
因為a[9]已經是最大 接下來第二次迴圈 j=1 t=8 將剩下9個數中最大的換到a[8]以此類推到最後乙個數。
上面那個迴圈巢狀完成的就是下面的過程
氣泡排序演算法的運作如下:
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
c語言氣泡排序。
3樓:大野瘦子
#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;}
4樓:匿名使用者
//以下以四個數字的給舉例,便於理解;
#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*/
5樓:鮮日國漢
#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;}
6樓:盛京小伙
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趟掃瞄。 ③改進不對稱性的方法 在排序過程中交替改變掃瞄方向,可改進不對稱性 複製過來的! 7樓:抗婉竭青 本題的乙個完整的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區間的隨機數*/} 8樓:性煥老澹 這是優化後的演算法,如果陣列已有序,則沒有執行到 tag=1;所以退出迴圈,避免做無用功 9樓:碎裂什麼捏 #include int main() for(i=1;i<=a;i++) } }for(i=1;i<=a;i++) return 0;} 10樓:祖任練易蓉 你的程式裡排序時是按照大數存到低位址, 小數存到高位址,輸出時是先輸出高位址,後輸出低位址,所以輸出的數是公升序。而有錯位是因為輸出的格式是乙個「%d\t」,未給定數值的位寬。即456佔三個字元,而78是兩個字元。 11樓:哇哎西西 氣泡排序的思想: 首先,從表頭開始往後掃瞄陣列,在掃瞄過程中逐對比較相領兩個元素的大小。 若相鄰兩個元素中,前面的元素大於後面的元素,則將它們互換, 稱之為清去了乙個逆序。在掃瞄過程中,不斷地將兩相鄰元素中的大者往後移動,最後就將陣列中的最大者換到了表的最後,這正是陣列中最大元素應有的位置。 然後,在剩下的陣列元素中(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語言程式設計:對10個數氣泡排序(公升序)。 12樓:匿名使用者 #include int main(); for (int j = 0; j < 9; j++) for (int i = 0; i < 9 - j; i++) }for (int i = 0; i < 10; i++) }擴充套件資料: 常見排序演算法 快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。 插入排序 已知一組公升序排列資料a[1]、a[2]、……a[n],一組無序資料b[1]、b[2]、……b[m],需將二者合併成乙個公升序數列。 首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a陣列中某一資料a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。 b[2]~b[m]用相同方法插入。 快速排序 快速排序是大家已知的常用排序演算法中最快的排序方法。已知一組無序資料a[1]、a[2]、……a[n],需將其按公升序排列。首先任取資料a[x]作為基準。 比較a[x]與其它資料並排序,使a[x]排在資料的第k位,並且使a[1]~a[k-1]中的每乙個資料希爾排序 已知一組無序資料a[1]、a[2]、……a[n],需將其按公升序排列。 文文的鵬鵬 lz的排序方法是錯誤的。比如,輸入8 6 12 0,按照lz的演算法,最終的排序結果是6 8 12 0。lz的演算法只能保證每相鄰的兩個數小在前大在後,但整體結果並不是這樣,所以排序還是要雙重迴圈的。 排序方法挺多的,各有各的優缺點的,有些人只是習慣了用某一個而已。 哈哈,可以用選擇排序... 氣泡排序法,是c語言常用的排序演算法之一,意思是對一組數字進行從大到小或者從小到大排序的一種演算法。具體方法是 相鄰數值兩兩交換。從第乙個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換 對調 如果其與我們的期望一致,則不用交換。重複這樣的過程,一直到最後沒有數值需要交換... 1.排序演算法在實際中的應用當然也就是排序了。在實際應用當中比如資料統計等方面都會用到。而且對一組資料進行排序也方便了後面對資料查詢的操作。要知道在一個有序陣列中查詢和在一個隨機無序陣列中的查詢的時間複雜度和系統消耗是有天壤之別的。2.演算法複雜度其實是一個估計,也就是那個o n 首先o這個操作的定...C語言氣泡排序問題,c語言氣泡排序問題!?
C語言氣泡排序法是什麼?
c 排序演算法,氣泡排序法C 演算法