開開心心學演算法 排序演算法

2021-10-03 05:01:56 字數 2765 閱讀 3526

歸併排序

快速排序

堆排序

思路

對於乙個序列為1, a2, … ,an>的序列而言,1>是有序序列,而2, … ,an>為待排序序列;

那麼先抽出a2,讓key = a2,這一步的目的是防止當a1往後移動的時候a2被覆蓋掉;

然後讓a1與a2比較,如果a1

<= a2,則保持a2的位置不變;否則將a1向後移動一位,那麼此時a1就在原來a2所在的位置了,然後將a2(也就是key)放在a1的位置上。

那麼此時1, a2>就是有序序列,3,… , an>就是待排序序列。再重複2~3的步驟,直到待排序序列為空。

**如下

// 插入排序——普通形式引數輸入

void

insertion_sort

(int a,

int n)

a[i +1]

= key;}}

// 插入排序——vector引數,使用引用

void

insertion_sort_up

(std::vector<

int>

& a)

a[i +1]

= key;

}}

遞迴方法的思路同上,只不過是將乙個大問題化為小問題求解的過程,而這些小問題的解決方法與大問題相同。

**如下

// 插入排序——遞迴式

void

insert

(std::vector<

int>

&a,const

int n)

a[i +1]

= key;

}void

insert_sort

(std::vector<

int>

&a,const

int n)

}

這個方法與非遞迴的方法差不多,只不過在搜尋插入位置的時候採用二分法來搜尋,這樣有利於降低時間複雜度。

**如下

// 第一種

void

binary_insert1

(std::vector<

int>

& a)

if(low != i)}}

// 第二種

void

binary_insert2

(std::vector<

int>

& a)

for(j = i; j > low; j--

) a[j]

= a[j-1]

; a[j]

= key;

}}

採用分治法的思想:

1.分解待排序的n個元素的序列成各具有n/2個元素的兩個子串行;

2. 使用歸併排序遞迴地排序兩個子串行;

3. 合併兩個已排序的子串行來產生最終的有序序列。

**如下

// 合併有序序列

void

merge

(std::vector<

int>

&a,const

int p,

const

int q,

const

int r)

else}}

// 歸併排序的遞迴操作

void

merge_sort

(std::vector<

int>

&a,const

int p,

const

int r)

}

思路:

以序列的第乙個數字基準key = a[0];

i指向key的後乙個值,j指向序列的最後乙個值;

當a[i] < key,就執行i++,直到遇到比key大的就停止;當a[j] > key,就執行j–,直到遇到比key小的就停止;

交換a[i] 和a[j]的值。

最後將key與a[i]交換。

對[0, i-1]和[i+1, a.size()-1]進行1~5的操作。

根據上面的描述,其實可以看出快速排序也採用了分治的思想

void

quicksort

(std::vector<

int>

& a,

int n,

int m)

}// 將基準key與a[i]交換,此時在a[i]左邊的都比它小,右邊的都比它大

int t = a[i]

; a[i]

= key;

a[n]

= t;

// 此時第i個數是有序的,那麼接下來對【n,i-1】和【i+1,m】分別排序

// 遞迴地對左右兩邊進行排序

quicksort

(a, n, i -1)

;// 【n,i-1】

quicksort

(a, i +

1, m)

;// 【i+1,m】

}}

堆排序演算法的**詳解 & **詳解

開開心心學演算法 一種排序

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複 還知道這個長方形的寬和長,編號 長 寬都是整數 現在要求按照一下方式排序 預設排序規則都是從小到大 1.按照編號從小到大排序 2.對於編號相等的長方形,按照長方形的長...

開開心心學演算法 一種排序

時間限制 3000ms 記憶體限制 65535kb 難度 3 描述 現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複 還知道這個長方形的寬和長,編號 長 寬都是整數 現在要求按照一下方式排序 預設排序規則都是從小到大 1.按照編號從小到大排序 2.對於編號相等的長方形,按照長方形的長排序...

開開心心學演算法 噴水裝置(一)

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0 輸入第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共有n個噴水裝置,...