0.基本思想
選定基準值(通常為當前陣列的第乙個元素),經過一系列比較和交換,將比基準值小的放在其左邊,將比基準值大的放在其右邊,這稱為是一次迴圈。
#include usingnamespace
std;
void qsort(int arr, int low, int
high)
}/*從右向左找比key小的值
*/while (arr[--j] >key)
}if (i >= j) break
;
/*交換i,j對應的值
*/int temp =arr[i];
arr[i] =arr[j];
arr[j] =temp;
}/*中樞值與j對應值交換
*/int temp =arr[low];
arr[low] =arr[j];
arr[j] =temp;
qsort(arr, low, j - 1
); qsort(arr, j + 1
, high);
}int
main()
; qsort(a,
0, sizeof(a) / sizeof(a[0]) - 1);/*
這裡原文第三個引數要減1否則記憶體越界
*/for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
return0;
}
**:非常好的一篇博文!
//快速排序
public
static
void quicksort(int a, int left, int
right) }//
快速排序陣列劃分
private
static
int partition(int a, int left, int
right)
}swap(a, p+1
, right);
return p+1
;}
精髓:p指向的是比基準元素(這裡選取的是最右元素)小的最後乙個的元素位置。最後p+1的位置就是right的最終的位置。
如果if判斷語句改為了》,那麼就是只有在a[i]比基準元素大的時候才會被調整到前面,就是大在前,從大到小排序了。
博文中給的例子也很好。
//快速排序的隨機化版本,除了呼叫劃分函式不同,和之前快排的**結構一模一樣
public
static
void randomquicksort(int a, int left, int
right) }//
隨機化劃分
public
static
int randompartition(int a, int left, int
right)
因為在陣列有序的時候,如果只選擇最右作為基準,快排就退化為選擇排序,複雜度o(n^2)。快排平均時間複雜度是o(nlogn),對於每乙個元素都是排左和排右。所以這裡的改進策略是隨機選取基準元素,就可以得到平衡的劃分。
上面博文中給了測試結果,在隨機化的序列中,普通快排相較於隨機化更快一點,因為後者多了生成隨機數與交換的過程。
但是在已經排好序的序列中,隨機化是碾壓級別的!
應用:215. 陣列中的第k個最大元素
隨機化快速排序
define max size 100 include include using namespace std 交換指標p1,p2指向的值 void exchange int p1,int p2 pa為指向a的陣列,p,r為下標,對a p.r 進行就地重排,以a r 為主元 劃分為小於主元和大於主元...
隨機化的快速排序
快排是所有排序演算法中平均效能最好的一種排序,雖然它的最壞的情況和氣泡排序一樣是 n 2。但是平均來說為o n logn 現在研究生又開始學演算法了,主要是隨機演算法,分布式演算法,和概率演算法。第一節課講的是隨機化的快速排序,但是我覺得當n比較小的時候不適合隨機演算法,因為隨機的過程也在花費時間,...
快速排序之隨機化
快速排序的思想就是選擇乙個基準數,讓每個數與它比較,找到它在所有這些數排好序後應該在的位置。而快速排序對大體應經排好序的數執行效率是n 2,所以對基準數隨機化,以下 include include using namespace std 產生m到n的隨機數 int random int m,int ...