關於Sort排序與冒泡法的區別
Sort排序和冒泡法的異同
對陣列a{2,4,3,6,2,8,1}進行排序。
快速排序法
原理:
對於陣列a{2,4,3,6,2,8,1}
① 需要選取一個關鍵元素作為基準元素key,用陣列內所有元素跟基準元素比較大小
② 先假設陣列內第一個元素的角標為i,最後一個元素角標為j
③ 先將陣列元素最後一個元素跟基準元素比較,若a[j]>key,則j--,直到a[j]<key,然後進行交換,大的放後面,小的放前面。接著進行第④步;
④ 將陣列元素第一個元素與基準元素比較,所a[i]<key,則i++,直到a[i]>key,然後進行交換。
⑤ 重複③④步,直到i==j,第一趟比較結束。(第一趟比較結束時,基準元素key一般在陣列元素的中間位置,然後以基準元素key為中軸,將陣列劃分為兩個子陣列,key左邊的子陣列都小於key,右邊的子陣列都大於key.)
注:若key為陣列元素的最小值,第一趟比較結束時,只比較key右邊的子陣列,再重新選子陣列的基準元素key1,然後進行比較。
若陣列為空時,則輸出一個空的序列。
若陣列不合法時,也輸出空序列。
關鍵點:1.找基準元素;
通常選取陣列內第一個元素為基準元素;
2. 設第一個元素角標為i;
設最後一個元素角標為j;
3.先由後往前跟基準元素比較,在右前往後比較;
4.劃分子陣列。
關於程式碼:
程式碼一:
package shuzu;
public classQuickSort {
public
voidsort(int[] arras,int
int i=low;
int j=high;
if(i>j){
/*使用了快速排序
arras:要排序的陣列
low:陣列的開始下標
high:陣列的末尾下標
*/
return;
}
int key=arras[low]; //選基準元素(一般都陣列內第一個元素)
while(true){ //
while(j>i){ //由j角標開始往前比較
if(arras[j]<key){ //交換
int temp=arras[j];
arras[j]=arras[i];
arras[i]=temp;
break;
}else{
j--;
}
}
while(j>i){ //由i角標開始往後比較
if(arras[i]>key){ //交換
int temp=arras[j];
arras[j]=arras[i];
arras[j]=arras[i];
arras[i]=temp;
break;
}else{
i++;
}
}
if(i==j){ //終止最外層迴圈,表示一趟比較結束
break;
}
} //此時的i=j是基準元素的角標
sort (arras,low,i-1); //基準元素左邊
sort (arras,i+1,high); //基準元素右邊
}
public voidprint(int[]arras ){ //列印陣列元素
for(inti=0;i<arras.length;i++){
if (i==arras.length-1){
System.out.print(arras[i]);
}else{
System.out.print(arras[i]+",\t");
}
}
}
public staticvoidmain(String[] args){
int[] arras ={2,4,3,6,2,8,1};
QuickSort qs=new QuickSort();
qs.sort(arras,0,arras.length-1);
qs.print(arras);
}
}
對於上面的程式碼,還有有幾個需要進一步理解的地方。
1.上面的sort(arras,low,i-1)是不是排序arras[low]到arrow[i-1]?沒見過這種表示方法,所以有點看不明白。
2.
為什麼定義low和high得在sort()內?
3.
對於qs.sort()這種表示也有迷惑,是不是說2、3兩個問題都是一種簡潔的表示方法?就像課件裡的程式碼那種簡潔的表示?
程式碼二:
package shuzu;
import java.util.Arrays;
public class sort {
public static void main(String[] args) {
int[] a = new int[]{2,4,3,6,2,8,1};
Arrays.sort(a);
for(inti:a){
System.out.print(a[i]+"\t");
}
}
}
或者是
package shuzu;
import java.util.Arrays;
public class sort {
public static void main(String[] args) {
int[] a = new int[]{2,4,3,6,2,8,1};
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
//for(int i:a){
System.out.print(a[i]+"\t");
}
}
}
這樣也是可以的
冒泡法排序
原理:
對於陣列a{2,4,3,6,2,8,1}
① 陣列內元素兩兩比較,先從前兩個開始
② 本著讓最大的元素放到最後的原則,若a[i]<a[i+1],則i++繼續比較;若a[i]>a[i+1],則交換位置。
③ 交換位置後,小的元素在前大的元素在後,然後繼續用大的元素跟後面元素比較,直到最後,此時該陣列最大元素到了最後的位置上,一趟比較結束。
④ 一趟比較結束後,繼續②③,(這時候,最後一個已經沉底的元素就不需要參與比較了)讓次大元素沉到倒數第二的位置上。一直迴圈,直到將所有元素排列好為止。
注:第一趟比較需進行a.length-1次比較;
第i趟比較需進行a.length-1-i次。
關鍵點:
冒泡法的關鍵點就在於a.length-1-i次比較有點不好理解,我感覺的話冒泡法還是比快速排序好理解一點,雖然快速排序法寫起來很簡單。
附程式碼:
寫法一
package shuzu;
public class MParray {
public static void main(String[] args) {
int[] a = new int[]{2,4,3,6,2,8,1};//定義一個int型陣列a,並輸入陣列元素
int temp=0; //定義一個臨時變數
for(int i=0;i<a.length-1;i++){
for(intj=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){ //比較相鄰兩個元素的大小,並交換
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
/*利用冒泡法排序
並用了兩個for迴圈巢狀
*/
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t"); //再利用一個for迴圈,遍歷排序後的陣列元素
}
}
}
寫法二
package shuzu;
public classBubbleSort{
public staticvoidmain(String[] args) {
int[] a = new int[]{2,4,3,6,2,8,1};
int temp = 0;
for (int i = a.length - 1; i > 0; --i){
for (int j = 0; j < i; ++j){
if (a[j + 1] < a[j]){
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t");
}
}
}
關於寫法二,寫法二是我從網上找資料的時候看到的,跟所學的不一樣,然後拿過來試一試,一樣能執行成功,
在for迴圈語句中,i++和++i並沒有什麼區別。
總結:
快速排序法的基本思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
冒泡法的基本思想:重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
快速排序法是在冒泡法的基礎上改進而來,其新的寫法比冒泡法更容易書寫。就像老師說的,在家用Sort排序,在外面用冒泡法,兩種方法交替使用,使得可以面對的情況更寬。
通過這兩天對Sort排序法資料的研究與整理,真的是受益匪淺。這不僅使我明白了Sort排序的原理,也加深了對冒泡法的理解,更讓我對於java或者說敲程式碼的理解更進一層。我發現對於以前看著就頭疼的程式程式碼,現在也是越來越有興趣了,也享受到了學習的樂趣,這是在進入大學以後第一次感受到的。
我喜歡這樣的生活,喜歡這裡的老師,也喜歡這裡的氛圍,感謝惠普!