在前面的部落格中,已經寫了關於陣列和鍊錶的選擇排序、氣泡排序和插入排序。在這裡,再次補充快速排序。快排的應用場景很多,其中面試中廣泛使用的就是在無序數集中查詢第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 ...