每組每個位置的數與它後面的數比較,前面數大於後面的數就交換數值,交換n-1組。
每次每組交換的時候,都會把最大的排到後面去,就類似與在水底泡泡慢慢的向上浮出。
穩定。
#includeint設定兩重迴圈,第一重迴圈做為比較的基準,第二重迴圈找它後面比它小的數,然後與之交換。main() ;
//為了方便大家理解,我將數值設為與**一樣的數值。
int n = 15
;
//氣泡排序
for(int i=0;i1;i++)//
代表的是要做多少組比對,為什麼是n-1呢?
//因為計數從0開始而且第乙個數和自身沒有比對的必要性。
for(int j=0;j1-i;j++)
//代表組裡面的序號,因為要與後面數做比較,而最後乙個數沒有與之比較的(可能會越界)所以n-1
//為什麼還要-i呢?
//因為每排過一遍,這一組最大值就排到後面去了,也就沒必要再去比較了。
if (a[j] > a[j + 1
])
for (int i = 0;i < n;i++)
printf(
"%d
", a[i]);
return0;
}
就是選擇乙個它後面的所有比他小的數中的最小的數進行交換,氣泡排序是固定後面的數,而選擇排序是固定前面的數。
移動資料的次數已知(n-1 次)。
//為了方便大家理解,我將數值設為與**一樣的數值。
int n = 15
;
//選擇排序
for (int i = 0;i < n - 1;i++) //
代表的是要做基數數值的下標,為什麼是n - 1呢?
//因為計數從0開始而且最後乙個數沒得數和它進行比較了。
}for (int i = 0;i < n;i++)
printf(
"%d
", a[i]);
return0;
}從第二個數開始,將數字抽出來與前面的數依次比較,大於它的統統向後移動一格。
也就是將抽出來的數放到它該在的位置。
在大多數元素已經有序的情況下,插入排序的工作量較小。
//為了方便大家理解,我將數值設為與**一樣的數值。
int n = 15
;
//選擇排序
for (int i = 1;i < n ;i++) //
代表的是要放回原位數數值的下標
for (int i = 0;i < n;i++)
printf(
"%d
", a[i]);
return0;
}可順便處理逆序對的問題。
這個演算法用**充分體現了它的思想,放在下面的是輔助陣列,將每部分以兩段兩段的分開進行排序,分開的排好了,再進行總的排序。
#includeint a = ;//為了方便大家理解,我將數值設為與**一樣的數值。
int t[20];//
輔助陣列,中轉站的意思。
void merge_sort(int l, int
r) }
intmain()
#includeint a = ;只要你把//為了方便大家理解,我將數值設為與**一樣的數值。
int t[20];//
輔助陣列,中轉站的意思。
int ans;//
逆序對數量
void merge_sort(int l, int
r) }
intmain()
else t[k++] = a[j++];成else t[k++]=a[j++],ans+=m-i;就好了,記得宣告ans變數。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
而else恰好符合這個條件只要有乙個是從右邊的數加進來的,就說明當前(左邊)下標的 i到m-1都是大於這個數的。
以中間數作為基數,同時從左右邊開始比較,因為基數是在中間,所以左邊的數要比基數小,右邊的數要比基數大,否則就交換數值,分支遞迴反覆便得出正確的順序。
可以處理求第幾大的問題;極快,資料移動少;
不穩定。
#includeint a = ;//為了方便大家理解,我將數值設為與之前一樣的數值。
void quick_sort(int l, int
r) }
//再分治,左右兩邊遞迴排序。
quick_sort(l, j);quick_sort(j + 1
, r);
}}int
main()
#includeint a = ;//為了方便大家理解,我將數值設為與之前一樣的數值。
int quick_sort(int l, int r, int
k) }
int s = j - l + 1;//
判斷左邊有多少數,是否包含第k個數
//分治,不斷縮小範圍,直到l==r,輸出答案。
if (k <= s) return
quick_sort(l, j, k);
//k>s的話說明第k個值在右邊的第k-s 個數中,那麼在右邊的k=k-s;
return quick_sort(j + 1, r, k -s);
}int
main()
演算法競賽入門經典 紫書 第四章
關於判斷素數的幾點 該函式有嚴重缺點 不能用於n 1和n較大的情況 在n接近int的最大值時 若i 46340時,i i 2147395600 若i 46341時,i i 2147488281超過了int的最大值,溢位變成了負數,就會繼續進行下去 intis prime int n return1 ...
uva213 優化演算法 紫書例題
注意,我的 和紫書 不一樣。首先來說一下我的 與紫書所給的 的區別。我的 不是對編碼頭做處理,而是對編碼資訊 也就是二進位制需解碼的資訊 進行處理,使其與編碼頭一一對應。怎麼說呢,我覺得我的 有思考的過程,我覺得有必要寫一下。思路 例子 編碼頭 abcdefghijklmn 我希望達成的目的是編碼頭...
演算法筆記 演算法初步之排序
壹.直接插入排序 自己的理解 插入排序是將陣列當成摸牌 1.預設的將第一張牌a 0 認為已經在手上了,從i 1開始摸牌,暫時放在temp裡,即temp a i 2.j i表示當前放在temp裡的牌應該放的位置,即a j 為了確定是哪一張牌應該放在這個位置,需要用temp與a j 1 當前應該放的位置...