前言:
剛剛學習到快速排序,快速排序是個基礎問題,去網上查了下,發現竟然沒有乙個讓人滿意的答案。
就連為什麼快速排序比氣泡排序快這個基本的概念,也沒人說清楚。
一般而言,網上對於為什麼快速排序比冒泡快,有兩種方向:
1.算時間複雜度
2.二分法的優越性
對於這兩種解釋,明顯沒有從根本上觸及原理。
對於1.算時間複雜度
這是邏輯顛倒,恰恰是效率高導致時間複雜度低。所以說這種解釋因果倒置。
對於2.二分法的優越性
這個我不知道說什麼好。
這裡預先我給出我的答案:冒泡***比較,只確定了乙個數的位置。而快速排序,可以確定乙個點的同時,還將陣列一分為二。氣泡排序由於是不同的數相比較而快速排序是和相同的數比較。相當於在比較中選擇了最極端的模式,浪費了資訊。氣泡排序可以算是每次都是最壞選擇的快速排序。(實際操作中:為提高效率,快速排序一般是一分為二,而沒有確定乙個點的位置)
概念:
快速排序:對乙個陣列操作,將陣列分成兩部分,前面的一部分比後面的一部分小(同組之間亂序),然後繼續分割兩個小陣列。。。
將陣列分成兩部分的操作:選取陣列中的乙個數,從兩端開始比較,左端的話如果小於就說明這個數可以放左邊,比較下乙個,如果大於那麼先待定;右邊的話,如果大於基數那麼說明這個數可以放右邊,比較下乙個,如果小於那麼和剛剛那個數對換。這樣依次確認位置,就能劃分完整個陣列。
如何通過比較和交換位置,達到左邊的都比該數小,右邊的都比該數大.
這裡直接給出思路:
1.單邊確認
規定:需要排序的陣列為arr ,選取的第乙個排序數為:arr[random](r表示在陣列下標範圍之內的隨機數)
1.if(arr[0]>arr[random])
2.if(arr[0]spoint)
} if (l-1>=0)
sort(arr, r+1, right);
}此時我們發現:有很多交換操作是不必要的,例如:如果最後乙個數是大於基數的就沒必要換過來。以及對於等於的情況沒有處理,所以無法排序有等值的數列。
2.雙邊排序+等值處理
public static void sort2(int arr,int left,int right)
int l=left;
int r=right;
int index=left+new random().nextint(right-left+1);
int spoint=arr[index];//用隨機位置確定比較的基數
while (lspoint&&l=0)
sort2(arr, l, right);
}
快速排序分析
1.開篇 終於還是忍不住要學習一下演算法啦,該面對的還是要面對,不能逃避,不能把已經會的技能忘掉,那是一種對生命的摧殘和不仁。不要怕,只要每天都在進步,水滴石穿,終有破雲見天日的時刻。感慨寫完了,回到正題,分析快速排序。2.原理 假設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣...
快速排序分析
首先簡單描述一下快速排序 1.快速排序樹不穩定的 由於關鍵字的比較與交換是跳躍進行的 2.時間複雜度為o n logn 最好情況為n logn 若陣列基本有序為n n 3.空間複雜度為logn 主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度為log2n,其空間複雜度也就為o logn 最壞情況...
快速排序分析
一直想研究一下快速排序,今天剛好有空,寫一下自己對快速排序的認識。快速排序由於排序效率在同為o n logn 的幾種排序方法中效率較高,因此經常被採用。該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右...