C 對快速排序與歸併排序的一些感悟

2021-10-18 16:28:54 字數 1973 閱讀 5123

學過演算法與資料結構的人都知道,幾乎所有教程都會講排序,然而實際程式設計中並不會真正的手寫排序演算法,慢慢的大家是否會產生疑問,是不是只要了解各種排序演算法的特點就好,不必過分執著於**,然而最近,我對此有了更深刻的認識。

各種排序演算法,實際深層次代表了不同的程式設計思想,並且好的實現方式,還運用了一些有用的程式設計技巧,這才是實際學習過程中真正需要掌握的東西,比如二分、遞迴等等。

細細把玩之後,會產生一種看山是山 看山不是山 看山還是山的感覺。

首先,對於各種排序演算法,網上有非常多的教程,在此我就不多說了,沒有看過的同學可以看下【十大經典排序演算法】

下面我主要講下我對快速排序與遞迴排序的一些感悟。

這裡用了一種遞迴的實現方式,關鍵點都在注釋裡了。

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.歸併排序歸併排序的核心思想 就是講乙個陣列分為前後兩部分分別進行排序,然後將有序的兩個陣列再合併...