python实现排序算法(上)

来源:互联网 发布:js解析json数组 map 编辑:程序博客网 时间:2024/06/14 20:05

1. 插入排序(Insert Sort)

算法概述:

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

基本思想:

每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

代码实现:

def insert_sort(lists):    count = len(lists)    for i in range(1,count):    key = lists[i]    j = i - 1    while j >= 0:        if lists[j] > key:            lists[j+1] = lists[j]            lists[j] = key        j -= 1    return lists                   

2. 希尔排序(Shell Sort)

算法概述:

希尔排序是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

基本思想:

该方法实质上是一种分组插入方法:
比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

代码实现:

def shell_sort(lists):    count = len(lists)    step = 2                       #每组元素个数从2开始,2、4、8...    group = conunt / step    while group > 0:        for i in range(0,group):   #遍历每组进行直接插入排序        j = i + group        while j < count:            key = list[j]          #每组即将插入的元素            k = j - group            while k >= 0:                                if lists[k] > key:                    lists[k+group] = lists[k]                    lists[k] = key                k -= group               j += group        group /= step              #group变为1即为直接插入算法    return lists

3. 冒泡排序(Bubble Sort)

算法概述:

冒泡排序,是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

基本思想:

冒泡排序算法的运作如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现:

基础版(每次找出最大放在表尾)

def bubble_sort(lists):    count = len(lists)    while count > 0:        for i in range(count-1):            if lists[i] > lists[i+1]:                lists[i] = lists[i] + lists[i+1]                lists[i+1] = lists[i] - lists[i+1]                lists[i] = lists[i] - lists[i+1]        count -= 1    return lists

进阶版(每次找出最小放在表首)

def bubble_sort(lists):    count = len(lists)    for i in range(0,count):        for j in range(i+1,count):            if lists[i] >lists[j]:                lists[i],lists[j] = lists[j],lists[i]    renturn lists

4. 快速排序(Quick Sort)

算法概述:

快速排序是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

基本思想:

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

代码实现:

def quick_sort(lists, low ,high):    i = low    j = hight    if i >= j:                         #出现此情况说明该组已排好序        return lists    key = lists[i]    while i < j:        whilei < j and lists[j] >= key:            j -= 1        lists[i] = lists[j]        whilei < j and lists[i] <= key:            i += 1        lists[j] = lists[i]    lists[i] = key    quick_sort(lists, low, i-1)    quick_sort(lists, i+1, high)            return lists
原创粉丝点击