排序演算法 經典排序演算法之氣泡排序

2021-06-21 06:47:24 字數 2328 閱讀 5235

氣泡排序很經典了,有人比喻過像是排序演算法中的hello world,很貼切。

演算法的基本思想是每次都需要兩兩比較大小。

氣泡排序演算法的過程如下:(從前往後)

1、比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3、針對所有的元素重複以上的步驟,除了最後乙個。

4、每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

時間複雜度為o(n*n),改進演算法複雜度下降至o(n),空間複雜度為o(1)。

氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

以資料6,4,2,5,3,7,1為例,排序結果為從小到大。

第0次排序:

4 6 2 5 3 7 1 

4 2 6 5 3 7 1 

4 2 5 6 3 7 1 

4 2 5 3 6 7 1 

4 2 5 3 6 7 1 

4 2 5 3 6 1 7 

第1次排序:

2 4 5 3 6 1 7 

2 4 5 3 6 1 7 

2 4 3 5 6 1 7 

2 4 3 5 6 1 7 

2 4 3 5 1 6 7 

第2次排序:

2 4 3 5 1 6 7 

2 3 4 5 1 6 7 

2 3 4 5 1 6 7 

2 3 4 1 5 6 7 

第3次排序:

2 3 4 1 5 6 7 

2 3 4 1 5 6 7 

2 3 1 4 5 6 7 

第4次排序:

2 3 1 4 5 6 7 

2 1 3 4 5 6 7 

第5次排序:

1 2 3 4 5 6 7 

第6次排序:

1 2 3 4 5 6 7 

根據以上可以觀察到:

排序每次都是交換資料的過程,第一次排序找到最大的數,第二次排序找到次大的數。那麼每次排序,交換資料並不需要掃瞄所有的資料。

核心**

public static void bubblesort(int array) 

} }}

觀察以上排序過程,發現,其實有重複操作。比如排序到第5次的時候,其實就已經是有序的了,第6次就沒必要再進行排序了。

可以設定標誌位,檢查排序情況,如果發現沒有資料交換了,就說明有序了,就不再排序了。

核心**

public static void bubblesort(int array) 

} if (!flag)

}}

觀察上述排序,其實還是有重複操作的。比如有50個數,前10個無序,後40個有序,那麼每次排序掃瞄的後半部分其實是無意義的。我們對上述演算法稍微改進,記錄每次排序交換的位置。下次迴圈只需要在交換位置之前比較大小就可以了。

public static void bubblesort(int array) 

} k = flag;

}}

完整**

public class sort 

printf(array);

}} }

/* * 氣泡排序演算法(改進1)

* 2023年3月29日 18:20:56

*/public static void bubblesort(int array)

printf(array);

}if (!flag)

} }/* * 氣泡排序演算法(改進2)

* 2023年3月29日 18:21:29

*/public static void bubblesort(int array)

}k = flag;

} }private static void swap(int array, int a, int b)

private static void printf(int array)

system.out.println(); }

public static void main(string args) ;

bubblesort(array);

printf(array);

}}

排序演算法 經典排序演算法之選擇排序

演算法的基本思想,是從無序中選擇最小的元素,然後交換。1 從陣列的第乙個元素開始,將待排序陣列分為有序和無序兩個區間。2 從無序陣列中選取最小的元素和有序陣列的最後乙個元素交換。3 重複第2步,直到無序陣列沒有元素為止。時間複雜度為o n n 空間複雜度為o 1 選擇排序是給每個位置選擇當前元素最小...

排序演算法 經典排序演算法之快速排序

快速排序的基本思想是分治法,即按照範圍內的第乙個元素劃分為兩個部分,再歸併排序。整體排序的過程有點類似建立平衡二叉樹的過程。1 假設陣列長度為len,low 0,high len 1。以陣列low為標準,根據和首元素的大小關係將待排序陣列分為兩個部分,返回分組index。2 陣列被劃分為兩部分0到i...

經典排序演算法之氣泡排序

好記性不如爛筆頭。氣泡排序屬於交換排序,交換排序的基本思想是 兩兩比較待排序記錄的關鍵字,當兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。include using namespace std void printpro int input,int len void swap int fi...