Python实现几种排序算法

来源:互联网 发布:瞻博网络 五百强 编辑:程序博客网 时间:2024/06/03 14:40
# -*- 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_nprint 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] = tempdef 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] = tempdef 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)

原创粉丝点击