Python实现几种排序算法

# -*- coding:utf-8 -*-
'''
In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排序。
Out-place sort:归并排序、计数排序、基数排序、桶排序。
stable sort:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序。
unstable sort:选择排序(5 8 5 2 9)、快速排序、堆排序。
'''
a_list = [6,7,5,4,3,2]

'''
插入排序:
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
'''
def insert_sort(list_n):
    for i in range(1,len(list_n)):
        key = list_n[i]
        j = i-1
        while j>=0 and list_n[j]>key:
            list_n[j+1]=list_n[j]
            j -=1
        list_n[j+1]=key
    return list_n
#print(insert_sort(a_list))
'''
def BinInsert_sort(list_n):
    for i in range(1,len(list_n)):
        key = list_n[i]
        left =0
        right=i-1
        while(left<=right):
            mid = (left+right)/2
            if list_n[mid]>key:
                right = mid-1
            else:
                left = mid+1
        for j in range(i-1,left,-1):
            list_n[j+1]=list_n[j]
            print list_n[j+1]
        print "+"*20
        list_n[left] = key
    return list_n
print BinInsert_sort(a_list)
'''
'''
冒泡排序:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
'''
def bubble_sort(list_n):
    k = len(list_n)
    while k>0:
        for i in range(len(list_n)-1):
            if list_n[i]>list_n[i+1]:
                list_n[i]=list_n[i]+list_n[i+1]
                list_n[i+1]=list_n[i]-list_n[i+1]
                list_n[i]=list_n[i]-list_n[i+1]
        k -=1
    return list_n
#print bubble_sort(a_list)
'''
鸡尾酒排序/双向冒泡排序:
1、依次比较相邻的两个数,将小数放在前面,大数放在后面;
2、第一趟可得到:将最大数放到最后一位。
3、第二趟可得到:将第二大的数放到倒数第二位。
4、如此下去,重复以上过程,直至最终完成排序。
'''
def cocktail_sort(list_n):
    for i in range(0,len(list_n)-1):
        for j in range(i+1,len(list_n)):
            if list_n[i]>list_n[j]:
                list_n[i]=list_n[i]+list_n[j]
                list_n[j]=list_n[i]-list_n[j]
                list_n[i]=list_n[i]-list_n[j]
    return list_n
#print(cocktail_sort(a_list))

'''
选择排序:
1、初始状态:无序区为R[1..n],有序区为空。
2、第i趟排序(i=1,2,3...n-1)
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。
该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,
使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
3、前n-1趟结束,数组有序化了
'''
def select_sort(list_n):
    for i in range(len(list_n)-1):
        temp = i
        for j in range(i+1,len(list_n)):
            if list_n[temp]>list_n[j]:
                temp = j
        if i!=temp:
            list_n[i]=list_n[i]+list_n[temp]
            list_n[temp]=list_n[i]-list_n[temp]
            list_n[i]=list_n[i]-list_n[temp]
    return list_n
#print(select_sort(a_list))
'''
归并排序:
1、Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
2、Conquer: 对这两个子序列分别采用归并排序。
3、Combine: 将两个排序好的子序列合并成一个最终的排序序列。
'''
def merge_sort(list_n):
    if len(list_n)<=1:
        return list_n
    m = int(len(list_n)/2)
    p_list = merge_sort(list_n[:m])
    q_list = merge_sort(list_n[m:])
    return merge(p_list,q_list)
def merge(p,q):
    temp =[]
    i,j = 0,0
    while i<len(p) and j <len(q):
        if p[i]<=q[j]:
            temp.append(p[i])
            i +=1
        else:
            temp.append(q[j])
            j +=1
    temp +=p[i:]
    temp +=q[j:]
    return temp
#print(merge_sort(a_list))

'''
希尔排序:
通过比较不同步长下表列表,第一次分为两组,即步长为group=len(list)/2来进行比较i与i+group大小;
下组则为上一个步长的一半,group= group/2进行新一轮二分之一步长大小比较i与i+group;
直至步长为1时,排序完成。
'''
def shell_sort(list_n):
    len_l = len(list_n)
    step = 2
    group = len_l/step
    while group>0:
        for i in range(0,group):
            j = i+group
            while j <len_l:
                k = j-group
                key = list_n[j]
                while k>=0:
                    if list_n[k]>key:
                        list_n[k+group]=list_n[k]
                        list_n[k]=key
                    k -=group
                j +=group
        group /=step
    return list_n
#print shell_sort(a_list)

'''
快速排序:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=L[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值L[j],将L[j]和L[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的L[i],将L[i]和L[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中L[j]不小于key,4中L[i]不大于key的时候改变j、i的值,
使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。
另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
'''
def quick_sort(L, low, high):
    i = low
    j = high
    if i >= j:
        return L
    key = L[i]
    while i < j:
        while i < j and L[j] >= key:
            j = j-1
        L[i] = L[j]

        while i < j and L[i] <= key:
            i = i+1
        L[j] = L[i]

    L[i] = key
    quick_sort(L, low, i-1)
    quick_sort(L, j+1, high)
    return L
#print quick_sort(a_list,0,len(a_list)-1)

'''
堆排序:
'''
def MinHeapFixup(L,i):
    temp = L[i]
    j = (i-1)/2
    while j >0 and i !=0:
        if L[j]<=temp:
            break
        L[i] = L[j]
        i = j
        j = (i-1)/2
    L[i] = temp
def MinHeapAddNumber(L,n,nNum):
    L[n] = nNum
    MinHeapFixup(L,n)
def MinHeapFixdown(L,i,n):
    temp = L[i]
    j = 2*i+1
    while j<n:
        if j+1<n and L[j+1]<L[j]:
            j +=1
        if L[j]>=temp:
            break
        L[i] = L[j]
        i = j
        j = 2*i+1
    L[i] = temp
def MinHeapDeleteNumber(L,n):
    L[0],L[n-1] = L[n-1], L[0]
    MinHeapFixdown(L,0,n-1)
def MakeMinHeap(L,n):
    for i in range(n/2-1,-1,-1):
        MinHeapFixdown(L,i,n)

猜你喜欢

转载自blog.csdn.net/qq_15508113/article/details/72822699
今日推荐