赞
踩
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
基本步骤:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。
- def shell_sort(alist):
- n =len(alist)
- # 初始步长
- gap = n // 2
- while gap > 0:
- # 按步长进行插入排序
- for i in range(gap, n):
- j = i
- # 插入排序
- while j>=gap and alist[j-gap] > alist[j]:
- alist[j-gap], alist[j] = alist[j], alist[j-gap]
- j -= gap
- # 得到新的步长
- gap = gap // 2
-
- alist = [54,26,93,17,77,31,44,55,20]
- shell_sort(alist)
- print(alist)
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
- def quick_sort(alist, start, end):
- """快速排序"""
-
- # 递归的退出条件
- if start >= end:
- return
-
- # 设定起始元素为要寻找位置的基准元素
- mid = alist[start]
-
- # low为序列左边的由左向右移动的游标
- low = start
-
- # high为序列右边的由右向左移动的游标
- high = end
-
- while low < high:
- # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
- while low < high and alist[high] >= mid:
- high -= 1
- # 将high指向的元素放到low的位置上
- alist[low] = alist[high]
-
- # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
- while low < high and alist[low] < mid:
- low += 1
- # 将low指向的元素放到high的位置上
- alist[high] = alist[low]
-
- # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
- # 将基准元素放到该位置
- alist[low] = mid
-
- # 对基准元素左边的子序列进行快速排序
- quick_sort(alist, start, low-1)
-
- # 对基准元素右边的子序列进行快速排序
- quick_sort(alist, low+1, end)
-
-
- alist = [54,26,93,17,77,31,44,55,20]
- quick_sort(alist,0,len(alist)-1)
- print(alist)
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
- def merge_sort(array):
- if len(array) == 1:
- return array
- left_array = merge_sort(array[:len(array) // 2])
- right_array = merge_sort(array[len(array) // 2:])
- return merge(left_array, right_array)
-
-
- def merge(left_array, right_array):
- left_index, right_index, merge_array = 0, 0, list()
- while left_index < len(left_array) and right_index < len(right_array):
- if left_array[left_index] <= right_array[right_index]:
- merge_array.append(left_array[left_index])
- left_index += 1
- else:
- merge_array.append(right_array[right_index])
- right_index += 1
- merge_array = merge_array + left_array[left_index:] + right_array[right_index:]
- return merge_array
-
-
- if __name__ == '__main__':
- array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
- print(merge_sort(array))
搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
递归版本:
- def binary_search(alist, item):
- if len(alist) == 0:
- return False
- else:
- midpoint = len(alist)//2
- if alist[midpoint]==item:
- return True
- else:
- if item<alist[midpoint]:
- return binary_search(alist[:midpoint],item)
- else:
- return binary_search(alist[midpoint+1:],item)
-
- testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
- print(binary_search(testlist, 3))
- print(binary_search(testlist, 13))
非递归版本:
- def binary_search(alist, item):
- first = 0
- last = len(alist) - 1
- while first <= last:
- midpoint = (first + last) // 2
- if alist[midpoint] == item:
- return True
- elif item < alist[midpoint]:
- last = midpoint - 1
- else:
- first = midpoint + 1
- return False
-
- testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]
- print(binary_search(testlist, 3))
- print(binary_search(testlist, 13))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。