紫書 演算法競賽之排序演算法筆記

2022-08-23 10:12:11 字數 3180 閱讀 9672

每組每個位置的數與它後面的數比較,前面數大於後面的數就交換數值,交換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 當前應該放的位置...