quick_sort(int a,int start,int end);
int i=start , j=end , pivot;
一. 先選擇乙個基準pivot,3種選擇方式
1.固定位置,開頭或結尾或中間
2.隨機位置,採用隨機數產生start和end之間的數
3.平衡位置,即從開頭結尾中間三個數中選擇他們的中間數,達到平衡的目的
二. 通過比較與該基準的關係,將原陣列分為元素個數比較接近的兩個陣列,
1.while(iwhile(a[i]while(a[j]>pivot) j--; //這個從後往前找,找到小於基準的數
swap(a[i],a[j]); //交換兩個數
三.接下來對兩個子陣列分別進行快排
if(i < end ) quick_sort(a,i,end); //因為從上面的步驟,i 之前的都是小於基準的數
if(j > start) quick_sort(a,start,j); //同理
四. 上面遞迴進行到一定程度的時候,將不會再滿足i start 條件,這時候快排完成,遞迴完畢
平均時間複雜度o(nlogn);
最壞時間複雜度o(n^n) ; 此時因為選取的基準不好,每一次都分成兩個個數相差很多甚至乙個為空的陣列
漸進複雜度: o(nlogn);
它是不穩定的排序演算法,因為快速排序可能會改變相等的兩個數之間的相對位置,如
排序之後第乙個2便到了第二個2的後面
快速排序詳細講解
五種常見排序就是 冒泡 插入 選擇 快速排序 歸併排序 排序和查詢的關係 排序是查詢的前提 排序是重點 在這裡,快速排序,顧名思義,排序速度較快,但是較為複雜,但是遞迴這個思想,說簡單但是也有些繞,說難也就幾行 的問題。先確定無序陣列裡的某乙個元素在有序裡的位置,這樣就把陣列分成兩半無序陣列 每一半...
新手講排序 歸併排序
歸併排序給我的感覺 程式設計一定要認真,不然就算你能想通也要糾纏你很長時間 1 本質 1.分解 用二分法,每次將陣列分成兩個元素數量相同或者差乙個 奇數 的子陣列,然後遞迴直到將子陣列分成乙個乙個的元素,實際陣列不用分,你直接將它看成已經分好的元素 2.合併 將len 1的陣列合併成len 2的陣列...
快速排序講解
高快省的排序演算法 有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它...