交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:氣泡排序和快速排序。
氣泡排序
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
(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)
//氣泡排序
void bubblesort(int array,int n)
}if (flag == 0) /*本趟排序未發生交換,提前終止演算法*/
break;
/*printf("第%d趟排序結果: \n",i+1);
printarray(array,n);*/}
}void testbubblesort()
;bubblesort(array,8);
printarray(array,8);
}問題
有一陣列a,長度為n,把陣列中的元素從小到大重新排列
思路
從0到n-1,兩兩比較陣列中的元素,如果前者大於後者,則交換之(如a[0]>a[1],則交換a[0]和a[1])。作一趟氣泡排序後,最大值就在最後乙個位置a[n-1]上了。然後對餘下的0到n-2個元素作第二趟氣泡排序,次最大值就去到倒數第二個位置a[n-2]上了,如此類推。
例如對10,-3,5,34,-34,5,0,9進行排序
第一趟:-3,5,10,-34,5,0,9,34
第二趟:-3,5,-34,5,0,9,10,34
第三趟:-3,-34,5,5,0,9,10,34
第四趟:-34,-3,5,0,5,9,10,34
第五趟:-34,-3,0,5,5,9,10,34
這時不再發生交換,排序結束。
核心**:
static void sort(int array)
} if(!issort) break; //如果沒有發生交換,則退出迴圈 } }
全部**:
package com.icescut.classic.algorithm;
public class bubblesort ; //test data
sort(array);
for(int el : array)
} static void sort(int array)
} if(!issort) break; //如果沒有發生交換,則退出迴圈
} } }
氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
氣泡排序演算法的運作如下:
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
氣泡排序的過程圖:
**:
1public
class bubblesort;
4for (int i = 0; i < score.length -1; i++)
11 }
12 system.out.print("第" + (i + 1) + "次排序結果:");
13for(int a = 0; a < score.length; a++)
16 system.out.println("");
17 }
18 system.out.print("最終排序結果:");
19for(int a = 0; a < score.length; a++)
22 }
23 }
Java實現氣泡排序和選擇排序
氣泡排序 依次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。冒牌排序是穩定排序法。如下 氣泡排序 依次比較相鄰的兩個元素,如果前邊的元素大於後邊的元素則交換 這樣每次先排好的是最後...
氣泡排序java實現
基本思想 將待排序的n個元素垂直排成一列,依次比較上下相鄰的兩個元素,如果上面的數大於下面的,則兩者交換,第一趟氣泡排序的結果使得關鍵字最大的記錄被放在最後乙個位置上,然後第二趟起泡排序對前n 1個記錄進行同樣操作,結果是關鍵字次大的記錄被安放在第n 1個位置上,以此類推共進行n 1趟排序。特點 穩...
java實現氣泡排序
前面實現了快速排序演算法,其實這個算是難點的,如果是無序打亂的,用快速排序比較好。氣泡排序是從我們剛接觸程式設計到找工作面試經常能遇見到的,雖然它的效率並不高,但是很重要,不知道你忘記怎麼實現了沒有?首先看一下氣泡排序的例項圖 氣泡排序的過程很簡單,就是將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比...