比較相鄰的元素,如果前乙個比後乙個大,交換之。
第一趟排序第1個和第2個一對,比較與交換,隨後第2個和第3個一對比較交換,這樣直到倒數第2個和最後1個,將最大的數移動到最後一位。
第二趟將第二大的數移動至倒數第二位
…因此需要n-1趟;
對於每一次比較操作。若aj ≤ aj+1,aj, aj+1保持不變,於是aj ≤ aj+1;若aj > aj+1,則aj, aj+1互換位置,於是aj < aj+1。因此經過一次「比較」操作後恒有aj≤ aj+1。下面直接引用此結論。
對於每一次以下標1開始的迴圈,對j作數學歸納法。
進行了第j = 1次比較後,由上面結論知,aj≤ aj+1。所以aj+1是a1, …, aj, aj+1中最大的數。
假設當j = k 時「aj+1是a1, …, aj, aj+1中最大的數」成立。則當j = k + 1時,
由上面結論知,aj≤ aj+1,於是aj不超過aj+1。而根據假設aj是a1, …, aj-1, aj中最大的數。於是a1, …, aj, aj+1中最大的數是aj+1。
由數學歸納法原理可知。ai是a1, …, ai-1, ai中最大的數。
完成排序後,由剛才對i的討論的任意性可知a2 = max(a1, a2), a3 = max(a1, …, a3), …, an = max(a1,…, an)。
因為a1≤ max(a1, a2) ≤ max(a1, …, a3) ≤ … ≤ max(a1, …, an),
所以a1≤ a2≤ … ≤ an。
證畢。
public
class
bubblesortnormal
;int temp =0;
// 要遍歷的次數
for(
int i =
0; i < list.length-
1; i++)}
}}
從**中我們可以發現,最原始的氣泡排序演算法對相同規模的輸入,其排序次數是固定不變的。然而經過一次次排序操作後,未排資料將趨於穩定(即有序),這是因為每次「冒泡」都是相鄰元素進行比較和交換完成的。考慮到這種情況,我們便有了下面這種優化方案:
void
bubblesort1
(int arr,
int n)}}
}
第一種改進方案雖然有一定的優化效果,但只是考慮了尾端元素有序的情況,並沒有考慮到元素區域性有序這種情況,因此我們有了第二種改進方案:
void bubblesort2(int arr, int n)
}}
八大排序 氣泡排序
原理 每次比較兩個數值,然後將數值大的交換到右邊。本人理解 迴圈陣列長度的次數,每次迴圈,都會將當前剩下的,還未排好序的數值中最大的值,放到當前未排好序的數值的最右邊,即下標為 陣列的長度 當前迴圈的次數 當前迴圈的次數 i 1 下標是由0開始,所以下標值要加1才等於迴圈次數 注釋 減當前迴圈的次數...
八大排序演算法 氣泡排序
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。include include 常規氣泡排序 void bubblesort int r,int n ...
八大排序之氣泡排序
氣泡排序,穩定,平均與最壞時間複雜度為o n 2 最好為o n 空間複雜度為o 1 include using namespace std void bubblesort int numbers,const int length int main int length 0 cin length fo...