歸併排序
快速排序
堆排序
思路:**如下:對於乙個序列為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個噴水裝置,...