學習快速排序算法

       快速排序算法是一種分治排序算法。它將數組劃分爲兩個部分,而後分別對兩個部分進行排序。經過一次排序,算法將達到以下目的:python

        1.對於某個i,a[i]在數組的最終位置上。所謂最終位置,即該數組通過徹底排序後各個元素的位置。算法

        2.a[1],….,a[i-1]中的元素都比a[i]小。數組

        3.a[i+1],….,a[r]中的元素都比a[i]大。r是最後一個序號。ui

        快速排序是一個遞歸劃分過程。咱們對一個文件進行劃分,劃分的原則是將一些元素(劃分元素)放在它們最終應該在的位置上。比劃分元素小的元素都在劃分元素的左邊,比劃分元素大得元素都在劃分元素的右邊。而後分別對左右兩部分分別遞歸處理。spa


       選定a[0]做爲劃分元素。而後首先從左到右尋找比a[0]大的元素,找到後中止。接着從右到左尋找比a[0]小的元素,找到後中止。將這兩個元素交換。這樣小的元素被排到了a[0]的左邊,大的元素被排到了右邊。繼續剛纔的旅途,不斷的左右交換。最後劃分元素a[i]也作了交換,放到了它的最終位置上。.net

        對於數組A [7,9,0,1,3,1,5]其過程以下:code

第一次排序blog

       將A[0]=7設爲劃分元素。排序

       1.因爲是將A[0]設爲劃分元素,因此右遊標先移動。右遊標停留在A[6]=5上,由於5小於7。將A[0]A[6]交換.遞歸

       2.而後移動左遊標,遊標停留在A[1]=9上,由於9大於7。將A[1]A[6]交換。

       3.移動右遊標,遊標停留在A[5]=1上,將A[1]A[5]交換

       4.移動作遊標一直移動到A[5]=7,此時左遊標和右遊標相會,這次排序結束。劃分元素7,處於最終位置。

      第一次排序的結果將數組分爲兩個部分。第一部分是A[0]~A[4],由小於7的元素組成,第二部分爲A[6],由大於7的元素組成。接下來的操做是將第一次排序的步驟在這些分組中從新再來一遍。首先是A[0]~A[4]部分。

第二次排序

      將A[0]=5設爲劃分元素。

      1.一樣的從右遊標開始。右遊標定位到A[4]=3,由於3小於劃分元素5。將A[0]A[4]交換。

      2.開始移動左遊標,一直到A[4]=5。此時左遊標和右遊標相會,這次排序結束。劃分元素5處於最終位置。

     接下來的排序就是不斷的遞歸了,直到每一個元素都處於最終位置爲止。

第三次排序

第四次排序

第五次排序

第六次排序

當左邊的部分都遞歸結束後,開始遞歸右邊部分。

第七次排序

結果

 

      在以上的例子中劃分元素的位置其實很重要。以最左端做爲劃分元素,遊標就應該從右邊先移動;以最右端做爲劃分元素,遊標就應該從左邊先開始。這是爲了解決順序數組的問題。一個數組如[1,2,3,4,5],劃分元素爲最左邊,且左遊標先移動,那麼第一次排序的後果就會是[5,2,3,4,1]。這是一個錯誤的結果,將使排序永遠進行下去。


python代碼實現:

#!/usr/bin/env python

def swap(array,i,j):
  temp = array[i]
  array[i]=array[j]
  array[j]=temp
def parition(arry,begin,end):
  temp = array[begin]
  while 1:
    while begin<end:
      if(array[end]<temp):
        swap(array,begin,end)
        break
      else:
        end -=1
    while begin<end:
      if(array[begin]>temp):
        swap(array,begin,end)
        break
      else:
        begin += 1
    if(begin == end):
      break
  print array
  return begin
def quickSort(array,begin,end):
  i=parition(array,begin,end)
  if begin<i-1:
    print '------------right'
    quickSort(array,begin,i-1)
  if i+1<end:
    print '------------left'
    quickSort(array,i+1,end)

if __name__=="__main__":
  array=[7,9,0,1,3,1,5]
  quickSort(array,0,len(array)-1)
  print array

參考文檔:

http://my.oschina.net/997155658/blog/311407

《算法:C語言實現》

相關文章
相關標籤/搜索