快速排序 Quick Sort

2021-08-14 04:15:25 字數 1358 閱讀 7582

快速排序(quicksort):

思路:

遞迴二分,每次分出大小組(大組所有的數大於小組),然後遞迴處理大小組

具體實現:

-選擇第乙個元素為基準,以此為分組標準

-使用兩個游標(left和right)來往中間逼近,兩個游標把整個序列分成三個部分,小者區,待考察區和大者區

-演算法為了減少整體移動,巧妙的利用了把第乙個元素(基準)讀取到變數以後留出的空位,

-在最開始的時候,left指向的位置為空位,我們需要找較小的數來放到left的位置上來擴大小者區,所以可以移動right(從尾巴上往前找)來找比基準小的數,找到了就把數放到left指向的位置,把right指向的位置空出來

-上一步之後,left指向的位置就滿了,right指向的位置則空了,就不能再查詢較小的數了,要查較大的數了.

-接下來就應該移動left游標來找比基準大的數,找到了就把數放到right指向的位置,

-可以理解為有空位的游標需要數,有權利移動對方來找合適的數來填滿自己,填滿之後就轉移權力給對方,

-類似桌球,游標像是兩個一步步走走近的磁鐵, 空肚子磁鐵站著不動,吸著對方往前走,直到對方能給自己乙個合適的數

-直到兩個游標匯合,說明都比較過了,就結束了

void qsort(int* data, int head, int tail)

int left = head;

int right = tail;

int key = data[left];//挑選第乙個元素作為分組標準(基準),並且空出乙個位置出來

while (left < right)

data[left] = data[right];//把小的數放到空位上去,騰出乙個空位來

// 找乙個比基準大的數放到空位上來

while (left < right && data[left] <= key)

data[right] = data[left];

}// 如果left和right碰頭了,那麼說明都比較過了,可以結束了,此時left等於right

data[left] = key; // 把基準放回去

qsort(data, head, left - 1);

qsort(data, left + 1, tail);

}

因為每次分組標準的這個數的挑選有很大的標準,對效能的影響會比較大,

最理想的情況複雜度是o(nlogn),此時每次分組是最高效的等分,

最糟糕的情況是o(n2),此時分組效率最低,分組基準就是最大或者最小值,也就是已經排好序的佇列

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...