用python实现经典排序

1、冒泡排序

算法原理:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def Bubble_list(self,list):
        mlen = len(list)
        while mlen>1:
            index = 0
            for r in range(mlen):
                if list[index] > list[index + 1]:
                    list[index], list[index + 1] = list[index + 1], list[index]
                index = index + 1
                if index == mlen - 1:
                    break
            mlen = mlen - 1
        return list
更新于2019-12-2:
def bubble(list_a):
    for j in range(len(list_a) - 1):
        list_b = list_a[:len(list_a) - j]
        for i in range(len(list_b) - 1):
            if list_a[i] > list_a[i + 1]:
                list_a[i], list_a[i + 1] = list_a[i + 1], list_a[i]
    return list_a

  

2、选择排序

算法原理:

  1、初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;

  2、再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。

  3、以此类推,直到所有元素均排序完毕。

#简易思路是:对于list中第i个数,找出i~len(list)-1中最小的数,并于第i个数交换位置,此次循环结束后,再寻找i+1~len(list)-1中最小的数,并于第i+1个数交换位置,以此类推
def select_sort(self,list): '''选择排序''' for i in range(len(list)): min = i for r in range(i,len(list)): if list[min] > list[r + 1]: min = r+1 if r == len(list) - 2: break list[i],list[min]=list[min],list[i] if i == len(list) - 2: break return list
更新于2019-12-2:
def select(list_a):
    for j in range(len(list_a)-1):
        min_number = list_a[j]
        for i in range(j, len(list_a)):
            if list_a[i] < min_number:
                min_number = list_a[i]
                list_a[j], list_a[i] = list_a[i], list_a[j]
    return list_a

 

3、插入排序

算法原理:

  1、从第一个元素开始,该元素可以认为已经被排序

  2、取出下一个元素,在已经排序的元素序列中从后向前扫描

  3、如果该元素(已排序)大于新元素,将该元素移到下一位置

  4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

  5、将新元素插入到该位置后

  6、重复步骤2~5

插入排序分为;直接插入排序、二分法插入排序、链表插入排序、希尔排序

直接插入排序:

def Insert_sort_directly(self,list):
        '''直接插入排序'''
        for r in range(1,len(list)):
            i=r
            while list[r]<list[i-1]:
                i=i-1
                if i==0:
                    break
            list.insert(i,list[r])
            del list[r+1]
        return list
更新于2019-12-2
def insert():
    '''直接插入排序'''
    for i in range(1, len(list_a)):
        for j in (0,i):
            if list_a[i]<=list_a[j]:
                list_a.insert(j,list_a[i])
                del list_a[i+1]
    return list_a

  

二分法插入排序:

    def Insert_sort_division(self,list):
        '''二分法插入排序'''
        if list[0]>list[1]:        #由于二分法是在两个数的情况下比较,因此首先给list中前两位数排序
            list[0],list[1]=list[1],list[0]
        for r in range(2,len(list)):
            i=r
            lindex=0 #左边界
            rindex=i-1 #右边界
            while rindex-lindex!=1: #判断list[r]的区间,直至左边界和右边界为邻近边界
                mindex=(lindex+rindex)/2
                if list[r]>list[mindex]:
                    lindex=mindex
                else:
                    rindex=mindex
            if list[r]<list[lindex]: #判断list[r]在区间的位置(需要考虑到区间可能在最左边和最右边的情况,一般list[r]处于区间中间)
                list.insert(lindex,list[r])
            elif list[r]>list[rindex]:
                list.insert(rindex+1, list[r])
            else:
                list.insert(rindex,list[r])
            del list[r+1]
        return list

希尔排序:

先将要排序的一组记录按某个增量dn/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

   def Insert_sort_shell(self,list):
        '''希尔排序'''

        def form_list(d,list):
            '''将list按照增量d分割成若干个子序列'''
            allList=[]
            for r in range(d):
                i=r
                sublist = []
                while i<len(list):
                    sublist.append(list[i])
                    i=i+d
                allList.append(sublist)
            return allList

        def sublist_sort(allList):
            '''对每个子序列进行排序并还原原序列'''
            list=[]
            # 对子序列进行排序
            for r in allList:
                self.Insert_sort_directly(r)
            #还原原来序列
            i=0
            while i<len(allList[0]):
                for r in allList:
                    if i > len(r) - 1:
                        continue
                    list.append(r[i])
                i = i + 1
            return list

        d=len(list)/2
        while d!=0:
            allList=form_list(d,list)
            list=sublist_sort(allList)
            d=d/2
        return list

  

  

  

posted @ 2017-10-24 17:54  cuisygan  阅读(236)  评论(0编辑  收藏  举报