#include #include using namespace std;
int a[101],n;
void quicksort(int left,int right)
quicksort(1,n);
for(i=1;i<=n;i++)
while(arr[i]<=temp&&ii++;
}這裡兩個while的順序是不能改變的,想一想:
假設對如下進行排序:
如上圖,6在左,9在右 我們將6作為基數。
假設從左邊開始(與正確程式正好相反)
於是i 就會移動到現在的 數字 7 那個位置停下來,而 j 原來在 數字 9 那個位置 ,因為
while(arr[j]>=temp&&i
於是,j 也會停留在數字7 那個位置,於是問題來了。當你最後交換基數6與7時,不對呀!!。
問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的,而在上述例子中,為了滿足 i
但最後交換回去的時候,7就到了左邊,不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6.但現在不行了。
於是,我們必須從右邊開始,也就是從基數的對面開始
快速排序(啊哈演算法)
include include using namespace std int a 101 n void quicksort int left,int right quicksort 1,n for i 1 i n i while arr i temp ii 這裡兩個while的順序是不能改變的,想...
啊哈演算法之快速排序
快速排序之所以比較快,是因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定乙個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大得多了。因此總得比較和交換次數就少了。速度...
啊哈!演算法 1 1 快速排序
1.基本思路 就是選定乙個基準數,然後從兩端開始同時像中間探測,如果是要公升序排序,且選定第乙個為基準數的話,則當後面探測到比基準數小的就停下,然後就讓前面的走,前面當探測到比基準數大的就停下,然後交換,最後兩個探測針相遇時,就跳出迴圈,並且讓基準數放到中間去。2.注意事項 注意,在讓前面和後面探測...