原理:快速排序,說白了就是給基準資料找其正確索引位置的過程.
如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp=23;然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌:low指向起始位置,high指向末尾.
首先從後半部分開始,如果掃瞄到的值大於基準資料就讓high減1,如果發現有元素比該基準資料的值小(如上圖中18<=tmp),就將high位置的值賦值給low位置 ,結果如下:
然後開始從前往後掃瞄,如果掃瞄到的值小於基準資料就讓low加1,如果發現有元素大於基準資料的值(如上圖46=>tmp),就再將low位置的值賦值給high位置的值,指標移動並且資料交換後的結果如下:
然後再開始從後向前掃瞄,原理同上,發現上圖11<=tmp,則將low位置的值賦值給high位置的值,結果如下:
然後再開始從前往後遍歷,直到low=high結束迴圈,此時low或high的下標就是基準資料23在該陣列中的正確索引位置.如下圖所示.
這樣一遍走下來,可以很清楚的知道,其實快速排序的本質就是把基準數大的都放在基準數的右邊,把比基準數小的放在基準數的左邊,這樣就找到了該資料在陣列中的正確位置.
以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。
一些小結論
從上面的過程中可以看到:
①先從隊尾開始向前掃瞄且當low < high時,如果a[high] > tmp,則high–,但如果a[high] < tmp,則將high的值賦值給low,即arr[low] = a[high],同時要轉換陣列掃瞄的方式,即需要從隊首開始向隊尾進行掃瞄了
②同理,當從隊首開始向隊尾進行掃瞄時,如果a[low] < tmp,則low++,但如果a[low] > tmp了,則就需要將low位置的值賦值給high位置,即arr[low] = arr[high],同時將陣列掃瞄方式換為由隊尾向隊首進行掃瞄.
③不斷重複①和②,知道low>=high時(其實是low=high),low或high的位置就是該基準資料在陣列中的正確索引位置.
按照上訴理論我寫的**如下:
void quicksort(int arr, int low, int high)
}int getindex(int arr, int low, int high)
// 如果隊尾元素小於tmp了,需要將其賦值給low
arr[low] = arr[high];
// 當隊首元素小於等於tmp時,向前挪動low指標
while (low < high && arr[low] <= tmp)
// 當隊首元素大於tmp時,需要將其賦值給high
arr[high] = arr[low];
}// 跳出迴圈時low和high相等,此時的low或high就是tmp的正確索引位置
// 由原理部分可以很清楚的知道low位置的值並不是tmp,所以需要將tmp賦值給arr[low]
arr[low] = tmp;
return low; // 返回tmp的正確位置
}
快速排序原理及實現
快速排序的步驟 從陣列中選擇乙個基準數 選擇哪乙個沒有關係,為了方便一般選第乙個或者最後乙個,也可以隨機選擇 把小於基準數的數移動到基準數左邊,大於基準數的數移動到基準數右邊,和基準值相同的數可以放到任意一邊。此時,基準數左邊的所有值都小於右邊的任意值。對於左右兩邊的子陣列,重複以上操作,直到陣列有...
排序演算法集合(3) 快速排序原理及C 實現
快速排序的思想是 1 初始輸入值是一串亂序的數字s 2 選取某個邏輯位置的值為 中間值 m 然後經過用s中的其他元素跟m比較 比m大的元素都調整到在 中間值 之前,其餘的放置在 中間值 之後 現在,序列成了 準排序 狀態,s被調整為s 分為三個部分p m q 而這三個部分有p m q的關係 p內任意...
快速排序及c 實現
乙個暑假的閒暇,玩的是舒服了,可是腦子裡的各種演算法卻忘了,果然程式設計是個靠保持狀態的活,昨天覆習了便快排,拿出來寫個部落格加深個印象。簡介 快排是基於分治模式的,它的平均時間複雜度為o nlgn 最壞複雜度是o n n 思想 快排的其基本思想是,陣列中先隨機找個主元 pivot element ...