實現對陣列和鍊錶的快速排序

2021-09-03 08:17:56 字數 752 閱讀 7431

在前面的部落格中,已經寫了關於陣列和鍊錶的選擇排序、氣泡排序和插入排序。在這裡,再次補充快速排序。快排的應用場景很多,其中面試中廣泛使用的就是在無序數集中查詢第k個大(或小)的數值。下面,我們來處理一下該排序:

首先,在陣列中進行快排,這是非常常見的排序方式:

//快速排序演算法

void quick_sort(int *num, int fir, int sec)

fast = fast->next;//無論怎樣(交換後或不交換),快指標都要前行

}//至此,在此次快排中key的具體位置已找到,就在slow處;

swap(slow->value,key);//

linklist_quicksort(begin,slow);//在左邊遞迴進行快排

linklist_quicksort(slow->next,end);//在右邊遞迴進行快排

}

當然,也有(陣列的)非遞迴快排。這裡,我只給出**,如果大家有興趣,可以自己搜查一下理論知識(抱歉,因為間隔時間較長,我把理論忘了?)。

int partition(vector&vec,int low,int high)

if(mid+1//其實就是用棧儲存每乙個待排序子串的首尾元素下標,

//下一次while迴圈時取出這個範圍,對這段子序列進行partition操作

while(!st.empty())

if(mid+1}

}}

快速排序(陣列和鍊錶版本)

快速排序 如果在陣列已經是公升序降序的情況下,可能會出現n 2 的複雜度,可在預先處理 樞紐元的選取也有多種方式 第乙個區間第乙個數字 區間最後乙個數字 區間第乙個數字,最後乙個數字,中間位置的數字,這三個數的中位數為做樞紐元,一般來說 第三種會會使快排的效率好些 時間複雜度 o nlogn 最壞情...

鍊錶的快速排序

感覺鍊錶的快速排序也挺好寫的,甚至比陣列更容易理解,但不知道為什麼看到很多人都說快排不適合單鏈表結構的資料。取第乙個元素為哨兵,遍歷鍊錶,將小於 等於 大於的元素分成3個子鍊錶 遞迴整理 小於 鍊錶 遞迴整理 大於 鍊錶 將3個鍊錶連線起來。實現如下 鍊錶快速排序,返回最後乙個元素的位址 mynod...

鍊錶快速排序

對陣列中的元素按照從小到大的順序快速排序 void quicksort int a,int left,int right left和right分別是雙向鍊錶開頭和結尾的元素指標 void ranklist stu left,stu right while l r l score value l l ...