學過演算法與資料結構的人都知道,幾乎所有教程都會講排序,然而實際程式設計中並不會真正的手寫排序演算法,慢慢的大家是否會產生疑問,是不是只要了解各種排序演算法的特點就好,不必過分執著於**,然而最近,我對此有了更深刻的認識。
各種排序演算法,實際深層次代表了不同的程式設計思想,並且好的實現方式,還運用了一些有用的程式設計技巧,這才是實際學習過程中真正需要掌握的東西,比如二分、遞迴等等。
細細把玩之後,會產生一種看山是山 看山不是山 看山還是山的感覺。
首先,對於各種排序演算法,網上有非常多的教程,在此我就不多說了,沒有看過的同學可以看下【十大經典排序演算法】
下面我主要講下我對快速排序與遞迴排序的一些感悟。
這裡用了一種遞迴的實現方式,關鍵點都在注釋裡了。
void
swap
(int
*x,int
*y)void
quicksort
(int
*arr,
int start,
int end)
int left = start;
int right = end -1;
int privot = arr[end]
;// 此處選最後乙個數作為分隔點,實際privot的選取有很多種方法,好的方案能產生一定優化作用。
while
(left < right)
// 此處對迴圈跳出後做處理,處理一些邊界情況,必要時可以在迴圈中加flag
if(arr[left]
>= privot)
else
quicksort
(arr, start, left-1)
;// 遞迴呼叫,一般寫到這,遞迴頭部的退出條件便水到渠成
quicksort
(arr, left +
1, end);}
// 借用力扣 912 題做驗證
// int*
sortarray
(int
* nums,
int numssize,
int* returnsize)
quicksort
(relt,
0, numssize-1)
;return relt;
}
void
merge
(int
*arr,
int start,
int mid,
int end)
else
if(arr[ptr1]
<= arr[ptr2])}
while
(ptr1 <= mid)
while
(ptr2 <= end)
for(
int i = start; i <= end; i++
)return;}
void
mergesort
(int
*arr,
int start,
int end)
// 分
int mid =
(start + end)/2
;mergesort
(arr, start, mid)
;mergesort
(arr, mid +
1, end)
;// 如果解決乙個問題,使用兩個有序序列可以很快解決,那麼,可以在此加入處理**
// 合
merge
(arr, start, mid, end);}
int*
sortarray
(int
* nums,
int numssize,
int* returnsize)
mergesort
(relt,
0, numssize-1)
;return relt;
}
歸併排序與快速排序
1.演算法簡介 歸併排序和快速排序都是採用遞迴的結構實現的,不同的是歸併排序在遞迴過程中有合併子串行的過程,而快速排序中沒有,但是快速排序中有較為複雜的劃分過程。二者的平均時間複雜度均為o nlgn 其中快速排序的係數較小 歸併排序最壞情況複雜度為o nlgn 快排在最壞情況下時間複雜度為o n 2...
快速排序與歸併排序
簡單總結一下快速排序和歸併排序的用法,這兩種方法十分省時,在題目中常用。快速排序 基本思想通過一趟排序將代拍記錄分成兩部分,一部分記錄關鍵字比另一部分小,再對這兩部分記錄繼續排序,達到整個序列有序。具體做法是附設兩個指標i和j,初值分別為l,r,任選乙個記錄做樞紐取mid,首先從j位置向前搜找到第乙...
歸併排序與快速排序
1.分治思想顧名思義,就是分而治之的意思,將大問題換分為無數個小問題,小的問題解決了,大的問題自然也就解決了。分之演算法一般都是用遞迴來實現的。分治是一種解決問題的處理思想,遞迴是是一種程式設計技巧。2.歸併排序歸併排序的核心思想 就是講乙個陣列分為前後兩部分分別進行排序,然後將有序的兩個陣列再合併...