冒泡排序的過程是首先將第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序,則將兩個記錄交換,然后比較第二個記錄和第三個記錄的關鍵字。以此類推,直至第n-1個記錄和第n個記錄的關鍵字進行過比較為止。上述過程稱為第一趟冒泡排序,接着第二趟對前面n-1個關鍵字進行同樣操作,……
快速排序是對冒泡排序的一種改進,通過一趟排序將記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分關鍵字小,可分別對這兩部分記錄以遞歸的方法繼續進行排序,以達到整個序列有序。
單趟Partition()函數過程請看下面動圖:
用Python進行實現:
#coding=utf-8 import time a=[49,38,65,97,76,13,27,49] b=[-1,49,38,65,97,76,13,27,49] #其中b[0]=-1這一位置是暫存單元,用於存放下面算法中的list[low] #冒泡排序------------------------------------------------------- def BubbleSort(list): for i in reversed(range(len(a))): for j in range(0,len(a)-1): if(list[j] > list[j+1]): temp=list[j] list[j]=list[j+1] list[j+1]=temp #快速排序------------------------------------------------------- def Partition(list,low,high): pivotkey=list[low] #樞軸 list[0]=list[low] while low<high: #從表的兩端交替地向中間掃描 while(low<high and list[high]>=pivotkey): high-=1 list[low]=list[high] #將比樞軸記錄小的移到低端 while(low<high and list[low]<=pivotkey): low+=1 list[high]=list[low] #將比樞軸記錄大的移到高端 list[low]=list[0] #樞軸記錄到位 return low #返回樞軸位置 def Qsort(list,low,high): if low<high: pivotloc=Partition(list,low,high); #將list一分為二 Qsort(list,low,pivotloc-1) #對低子表遞歸排序 Qsort(list,pivotloc+1,high) #對高子表遞歸排序 def QuickSort(list): Qsort(list,1,len(list)-1) #這個也是快速排序-------------------------------------------------- def qsort(list): if list==[]: return [] else: smaller=[x for x in list[1:] if x<list[0]] #比list[0]小的部分 bigger=[x for x in list[1:] if x>=list[0]] #比list[0]大(或相等)的部分 return qsort(smaller)+[list[0]]+qsort(bigger) #--------------------------------------------------------------- start_time=time.time() BubbleSort(a) QuickSort(b) use_time=time.time()-start_time print 'Time used: '+str(use_time) print a print b[1:]
參考書目:《數據結構:C語言版》, 嚴蔚敏,吳偉民編著, 清華大學出版社