用Python实现常见的排序算法
1. 冒泡排序
冒泡排序的思路十分简单,交换相邻的两个逆序的元素,知道迭代完所有元素为止。其耗时为O(n^2)
1 array = [9,3,7,4,2,6,5,1,8,0,19,15,13,18,12,16,17,11,14,20] 2 print 'Before bubble sorting:' 3 print array 4 5 print '' 6 print 'During bubble sorting:' 7 for i in range(0,len(array) - 1)://两轮循环迭代数组的所有元素 8 for j in range(i + 1,len(array)): 9 if array[i] > array[j]://如果当前两个相邻元素的大小关系不符要求,交换之 10 array[i],array[j] = array[j],array[i] 11 print array 12 13 print '' 14 print 'After bubble sorting:' 15 print array
2. 插入排序
插入排序把当前要排序的数组分为两部分,不妨设为array[1:len],一部分是已经排序好的子数组,设为array[1:k],一段是未排序好的字数组,不妨设为array[k+1:len]。每次从array[k+1:len]中选取array[k+1]作为要插入array[1:k]的元素。确定好位置以后插入即可。
插入排序是就地排序,不需要大量的辅助空间。
1 array = [4,2,6,10,7,12,1,8,13,44,5] 2 3 print array 4 5 for i in range(1,len(array))://从数组的第二个元素开始 6 value = array[i] 7 j = i-1 8 while j >= 0 and array[j] > value://如果array[j]小于当前value,则找到了合适的插入位置,若j《0,则插入位置为第一个元素。 9 array[j + 1] = array[j] 10 j -= 1 11 12 array[j + 1] = value//j有可能小于零 13 14 print array
3. 堆排序
用数组来表示二叉树。
堆是一种二叉树。
1 def maxHeapify(array,current,length): 2 left = 2 * current + 1 3 right = (current + 1) * 2 4 largest = current 5 6 if(left < length and array[current] < array[left]): 7 largest = left 8 9 if(right < length and array[largest] < array[right]): 10 largest = right 11 12 if largest != current: 13 array[current],array[largest] = array[largest],array[current] 14 maxHeapify(array,largest,length) 15 16 def buildMaxHeap(array,length): 17 for i in range(length/2-1,-1,-1): 18 maxHeapify(array,i,length) 19 print array 20 21 def HeapSort(array): 22 buildMaxHeap(array,len(array)) 23 24 for i in range(len(array)-1,0,-1): 25 array[i],array[0] = array[0],array[i] 26 maxHeapify(array,0,i) 27 28 array = [4,2,6,10,7,12,1,8,13,44,5] 29 print array 30 HeapSort(array) 31 print array
4. 合并排序
合并排序体现了分治递归的思想。
将待排序的数组分为两个子数组排序,再将排序好的子数组合并为一个数组。对于子数组的排序也如法炮制。递归的边界条件是待排序的数组是否只剩下一个元素。排序的主要过程其实在合并的过程当中。从单个元素开始排序,自底向上。
1 def merge(array,left,middle,right)://二路归并排序 2 length = right -left + 1 3 temp = [0 for i in range(0,length)]//合并排序需要与排序数组大小相等的辅助空间 4 i = left 5 j = middle + 1 6 k = 0 7 8 while i <= middle and j <= right: 9 if array[i] <= array[j]: 10 temp[k] = array[i] 11 i += 1 12 k += 1 13 else : 14 temp[k] = array[j] 15 j += 1 16 k += 1 17 18 if i <= middle: 19 temp[k:length] = array [i:middle + 1] 20 elif j <= right: 21 temp[k:length] = array [j:right + 1] 22 23 array[left:right + 1] = temp[0:length] 24 25 def mergeSort(array,left,right)://本函数比较好理解 26 if left < right: 27 middle = (left + right) / 2 28 mergeSort(array,left,middle) 29 mergeSort(array,middle+1,right) 30 merge(array,left,middle,right) 31 32 array = [4,2,10,9,7,8,14,1,25,98,45,17,43,86,56,19,20] 33 print array 34 mergeSort(array,0,len(array)-1) 35 print array
posted on 2012-08-03 21:00 edward1992 阅读(82) 评论(0) 收藏 举报
浙公网安备 33010602011771号