氣泡排序很經典了,有人比喻過像是排序演算法中的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...