用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)    收藏  举报

导航