快速排序
每一輪找到乙個關鍵資料 ,然後比他所有小的都放左邊,比他大的都放右邊,這樣兩邊走過一趟稱為一趟快速排序,然後從 中間分開,左右兩邊再進行一次迴圈 ,直到完全排序成功 。需要利用遞迴完成。
一趟快速排序的演算法是:
1.設定乙個定值,一般為陣列的第乙個數字,然後設定兩個變數i,j分別指向開頭末尾,用來進行遍歷
2.從末尾j開始向前找j--,發現比定值小等於的就讓ij交換位置
3.交換之後從i開始向後找i++,發現比定值大等於的讓ij交換位置
4.迴圈2-3,直到i>j 迴圈結束
5.一趟排序結束,將i-1作為尾部,開頭作為頭部,遞迴呼叫
j+1為頭部,結尾作為尾部,遞迴呼叫
最終通過遞迴,逐步從左到右邊完成排序
快速排序一趟從兩頭交替搜尋一直到i=j,因此時間複雜度為o(n),整個快速排序演算法跟趟數有關。
每次劃分幾乎二等分,則一共的趟數為0(log2 n) 時間複雜度為o(nlog2 n)空間複雜度o(log2 n)
最壞的時候是每次選擇的定值是當前的最大值或者最小值,使得每次劃分只能劃分乙個數字,則n個資料要n次排序 總的時間複雜度為o(n方)改善的方式為將定值盡量選擇為平均值或者中值
空間複雜度來自堆疊的log2(n+1)和乙個需要元素的輔助空間
//快速排序的效率為o(n*logn),但是快速排序不是穩定的排序
#include#include#include#define maxsize 20
#define maxnum 60
int a[maxsize];
void init() //生成隨機數列
puts("");
}void fft(int *a,int left,int right) //快速排序演算法 -遞迴實現
}快速排序可以通過修改交換規則從而讓演算法保持穩定性,但是會損失很多效能,得不償失。
全1情況,如果要求保留穩定性,相同的不交換,則時間複雜度變為n方
如果要求速度,相同的直接交換,可以保留速度。
快速排序的JAVA實現和效能分析
package sort 快速排序是不穩定的排序。快速排序的時間複雜度為o nlogn 當n較大時使用快排比較好,當序列基本有序時用快排反而不好。public class quicksort system.out.println 排序之前 for int i 0 i a.length i 快速排序 ...
C 實現快速排序和氣泡排序
快速排序思路 快速排序之所比較快,因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定乙個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣每次只能在相鄰的數之間進行交換,交換的距離就大的多了。因此總的比較和交換次...
快速排序和插入排序的C 實現
本來這是乙個很常見的演算法,可是接觸it這麼長時間了,竟然還不知道這種演算法的核心,是在慚愧,最近一直想補習這方面的內容於是也就,開始了我的演算法里程,現在就說說快速排序吧,本來我一直是在用氣泡排序的,可是總是被人恥笑,所以呢,現在想想,開始學習吧 快速排序吧,總體流程是這樣的,首先將獲取最後乙個元...