常用排序算法

1.冒泡排序

  • 又称交换排序法,原理是:从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调顺序后再进行下一个元素的对比。如此扫描过一次之后就可确保最后一个元素位于正确的顺序,接着再进行第二次扫描,直到所有元素的排序关系为止。这里看出是对一个序列进行移动交换操作,它的时间复杂度为O(n^2)。
    其示意图如下图所示:
冒泡排序
'''  冒泡排序  '''
def bubble_sort(list):
    n = len(list)
    count = 0
    for j in range(n-1):
        for i in range(n-1-j):
            if list[i] > list[i+1]:
                list[i],list[i+1] = list[i+1],list[i]
                count += 1
        if count == 0:
            return

  #list有n个数,需要进行n-1次排序
  #从左往右排序,第一次排序移动n-2次,第二次排序移动n-3次...

if __name__ == '__main__':
    list = [65,12,33,72,5,8,45,28]
    print(list)
    bubble_sort(list)
    print(list)

2.插入排序

  • 从数据最左拿一个元素,然后与第二个元素比较进行排序,组成新的序列,再将新的序列与第三个元素比较进行排序,重复上述操作最后得到正序或者倒序的数据。这里可以看成是两个序列,将旧序列最左的元素添加到新序列中并进行排序。
    其示意图为:
插入排序
'''  插入排序  '''
def insert_sort(list):
  n = len(list)
  for j in range(1,n):
      i = j
      while i > 0:
          if list[i] < list[i-1]:
              list[i],list[i-1] = list[i-1],list[i]
              i -= 1
          else:
              break

# i代表能蹭循环起始值
# i=j 执行从右边的无序序列中取出第一个元素,即i位置,插入前面正确的位置

if __name__ == '__main__':
    list = [65, 12, 33, 72, 5, 8, 45, 28]
    print(list)
    insert_sort(list)
    print(list)

3.选择排序

  • 从序列最左边拿出一个元素作为初始值,与右边序列的每个值进行对比,若右边的值小于初始值,交换元素,直到整个右边的元素对比完毕;然后取出右边序列最左边元素作为初始值,重复上述步骤,最后组成新的序列。
    其示意图为:
选择排序
'''  选择排序  '''
def select_sort(list):
    n = len(list)
    for j in range(0,n-1):
        min_index = j
        for i in range(j+1,n):
            if list[min_index] > list[i]:
                min_index = i
        list[j],list[min_index] = list[min_index],list[j]

#将最左边的的值作为初始值与右边的值进行对比,当右边的值小于初始值,交换元素,直到整个右边对比完
#将对比的结果作为最左边的值,从第二位开始,重复第一步的步骤

if __name__ == '__main__':
    list = [65, 12, 33, 72, 5, 8, 45, 28]
    print(list)
    select_sort(list)
    print(list)

4.希尔排序

  • 选取一个步长,例如 1 2 3 4 5 6,步长为2的话,会把数组分成1 3 5,2 4 6,这样分开之后对每部分进行直接插入排序,下一步缩小步长继续上述步骤,直至步长为1。
    其示意图如下图所示:
希尔排序
'''  希尔排序  '''
def shell_sort(list):
    n = len(list)
    gap = n // 2
    while gap > 0:
        for j in range(gap,n):
            i = j
            while i > 0:
                if list[i] < list[i-gap]:
                    list[i],list[i-gap] = list[i-gap],list[i]
                    i -= gap
                else:
                    break

if __name__ == '__main__':
    list = [65, 12, 33, 72, 5, 8, 45, 28]
    print(list)
    shell_sort(list)
    print(list)

5.快速排序

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
其示意图如下图所示:

快速排序
# 快速排序-分而治之
def quickSort(list):
    # 基线条件:为空或只包含一个元素的数组是“有序”的
    if len(list) < 2:
        return list
    else:
        pivot = list[0]
        # 由所有小于基准值的元素组成的子数组
        low = [i for i in list[1:] if i <= pivot]
        # 由所有大于基准值的元素组成的子数组
        high = [i for i in list[1:] if i > pivot]

        return quickSort(low) + [pivot] + quickSort(high)


if __name__ == '__main__':
    list = [65, 12, 33, 72, 5, 8, 45, 28]
    print(list)
    list = quickSort(list)
    print(list)

6.归并排序

  • 把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。
    其示意图如下图所示:
归并排序
 '''归并排序'''
  def merge_sort(list):
      n = len(list)
      if n <= 1:
          return
      mid = n//2          #拆分序列

      #left采取归并排序后形成的有序的新的列表
      left_list = merge_sort(list[:mid])

      #right采取归并排序后形成的有序的新的列表
      rigth_list = merge_sort(list[mid:])

      #将两个子序列合并成一个新的整体
      left_point,right_point = 0,0
      result = []
      while left_point < len(left_list) and right_point < len(rigth_list):
          if left_list[left_point] < rigth_list[right_point]:
              result.append(left_list[left_point])
              left_point += 1
          else:
              result.append(rigth_list[right_point])
              right_point += 1

      result += left_list[left_point]
      result += rigth_list[right_point]
      return result

if __name__ == '__main__':
      list = [65, 12, 33, 72, 5, 8, 45, 28]
      print(list)
      merge_sort(list)
      print(list)

7.二分法查找

'''  二分法查找  '''
def binary_search(list,item):   #二分法查找,递归
    n = len(list)
    if n > 0:
        mid = n // 2
        if list[mid] == item:
            return True
        elif item < list[mid]:
            return binary_search(list[:mid],item)
        else:
            return binary_search(list[mid+1:],item)
    return False

def binary_search_(list,item):  #二分查找,非递归
    n = len(list)
    first = 0
    last = n-1
    while first <= last:
        mid = (first+last)//2
        if list[mid] == item:
            return True
        elif item < list[mid]:
            last = mid-1
        else:
            first = mid+1
    return False


if __name__ == '__main__':
    list = [5,8,12,28,33,45,65,72]
    print(binary_search(list,33))
    print(binary_search(list,99))

    print(binary_search_(list,33))
    print(binary_search_(list,99)) 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容