前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Data Structures and Algorithms Basics(004):Sorting

Data Structures and Algorithms Basics(004):Sorting

作者头像
用户5473628
修改2019-08-08 14:56:03
2810
修改2019-08-08 14:56:03
举报
文章被收录于专栏:MiningAlgorithms

目录:

1,冒泡排序

2, 选择排序

3,插入排序

4,希尔排序

5,计数排序

6,基数排序

7,归并排序

8,快速排序

9,堆排序

代码语言:javascript
复制
# 1,冒泡排序:
import time
from random import randint
import matplotlib.pyplot as plt

def _bubble_sort(nums: list, reverse=False):
    start = time.time()
    for i in range(len(nums)):
        # Get (i+1) largest in the correct position
        for j in range(len(nums) - i - 1):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    if reverse:
        #nums = nums[::-1]  # why this is not working?
        nums.reverse()
    t = time.time() - start
    return len(nums), t

def bubble_sort_mod(array):
    import time
    start = time.time()    
    for i in range(len(array)): # n pass
        is_sorted = True  # initialize is_sorted
        for j in range(1, len(array) - i):
            if (array[j] < array[j - 1]):
                # swap
                array[j], array[j - 1] = array[j - 1], array[j]
                is_sorted = False
        
        if (is_sorted): break
    t = time.time() - start
    return len(array), t

def bubble_sorted(nums: list, reverse=False) -> list:
    """Bubble Sort"""
    nums_copy = list(nums)
    _bubble_sort(nums_copy, reverse=reverse)
    return nums_copy

if __name__ == '__main__':
  l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
  l = bubble_sorted(l, reverse=True)
  print(l)

  # 画图:时间复杂度
  def generate_random_array(n):
    return [randint(0, n) for e in range(n)]
  random_lists = [generate_random_array(100 * n) for n in range(1, 20)]
  rst = [_bubble_sort(l) for l in random_lists]
  x = list(zip(*rst))[0]
  y = list(zip(*rst))[1]
  plt.plot(x, y)
  plt.show()

# 2, 选择排序:
def selection_sort(items):
    start = time.time()
    for i in range(len(items)):   # n
        pos_min = i   #idx
        for j in range(i + 1, len(items)):  # n
            if (items[j] < items[pos_min]):
                pos_min = j

        items[i], items[pos_min] = items[pos_min], items[i]
    t = time.time() - start
    return len(items), t

if __name__ == '__main__':
  l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 99]
  selection_sort(l)
  print(l)

# 3,插入排序:
def insert_sort(items):
    start = time.time()
    for sort_inx in range(1,len(items)):
        unsort_inx = sort_inx
        while unsort_inx > 0 and items[unsort_inx-1] > items[unsort_inx]:
            items[unsort_inx-1], items[unsort_inx] = items[unsort_inx], items[unsort_inx-1]
            unsort_inx = unsort_inx-1
    t = time.time() - start
    return len(items), t

if __name__ == '__main__':
  l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 99]
  selection_sort(l)
  print(l)

# 4,希尔排序:
def shell_sort(nums):
    start = time.time()

    gap = len(nums)
    length = len(nums)

    while (gap > 0):
        for i in range(gap, length):
            for j in range(i, gap - 1, -gap):
                if (nums[j - gap] > nums[j]):
                    nums[j], nums[j - gap] = nums[j - gap], nums[j]

        if (gap == 2): 
            gap = 1
        else:
            gap = gap // 2

    t = time.time() - start
    return len(nums), t

# 5,计数排序:
def count_sort(items):
    start = time.time()    
    mmax, mmin = items[0], items[0]
    for i in range(1, len(items)):
        if (items[i] > mmax): mmax = items[i]
        elif (items[i] < mmin): mmin = items[i]
    print(mmax)
    nums = mmax - mmin + 1
    counts = [0] * nums
    for i in range (len(items)):
        counts[items[i] - mmin] = counts[items[i] - mmin] + 1

    pos = 0
    for i in range(nums):
        for j in range(counts[i]):
            items[pos] = i + mmin
            pos += 1
            
    t = time.time() - start
    return len(items), t


# 6,基数排序:
def radix_sort(array, base=10):
    start = time.time()    
    def list_to_buckets(array, base, iteration):
        buckets = [[] for _ in range(base)]
        for number in array:
            # Isolate the base-digit from the number
            digit = (number // (base ** iteration)) % base
            # Drop the number into the correct bucket
            buckets[digit].append(number)
        return buckets

    def buckets_to_list(buckets):
        numbers = []
        for bucket in buckets:
            # append the numbers in a bucket
            # sequentially to the returned array
            for number in bucket:
                numbers.append(number)
        return numbers

    maxval = max(array)

    it = 0
    # Iterate, sorting the array by each base-digit
    while base ** it <= maxval:
        array = buckets_to_list(list_to_buckets(array, base, it))
        it += 1

    t = time.time() - start
    return len(array), t

# 7,归并排序:
def _merge(a: list, b: list) -> list:
    """Merge two sorted list"""
    c = []
    while len(a) > 0 and len(b) > 0:
        if a[0] < b[0]:
            c.append(a[0])
            a.remove(a[0])
        else:
            c.append(b[0])
            b.remove(b[0])

    if len(a) == 0:
        c += b
    else:
        c += a
    return c


def _merge_sorted(nums: list) -> list:
    # Won't sort in place
    if len(nums) <= 1:
        return nums

    m = len(nums) // 2
    a = _merge_sorted(nums[:m])
    b = _merge_sorted(nums[m:])
    return _merge(a, b)


# Wrapper
def merge_sorted(nums: list, reverse=False) -> list:
    import time
    start = time.time()
    """Merge Sort"""
    nums = _merge_sorted(nums)
    if reverse:
        nums = nums[::-1]

    t = time.time() - start
    return nums, len(nums), t

if __name__ == '__main__':
  l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
  l = merge_sorted(l, reverse=True)[0]
  print(l)

# 8,快速排序:
def _quick_sorted(nums: list) -> list:
    if len(nums) <= 1:
        return nums

    pivot = nums[0]
    left_nums = _quick_sorted([x for x in nums[1:] if x < pivot])
    right_nums = _quick_sorted([x for x in nums[1:] if x >= pivot])
    return left_nums + [pivot] + right_nums


def quick_sorted(nums: list, reverse=False) -> list:
    """Quick Sort"""
    start = time.time()
    nums = _quick_sorted(nums)
    if reverse:
        nums = nums[::-1]
    t = time.time() - start
    return nums, len(nums), t

if __name__ == '__main__':
  l = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
  l = quick_sorted(l, reverse=True)
  print(l)

  # 画图:时间复杂度
  # rst = [quick_sorted(l) for l in random_lists]
  # r = [(l[1],l[2]) for l in rst]
  # x = list(zip(*r))[0]
  # y = list(zip(*r))[1]
  # plt.plot(x, y)
  # plt.show()
  
# 9,堆排序:
def head_sort(list):
  length_list = len(list)
  first=int(length_list/2-1)
  for start in range(first,-1,-1):
    max_heapify(list,start,length_list-1)
  for end in range(length_list-1,0,-1):
    list[end],list[0]=list[0],list[end]
    max_heapify(list,0,end-1)
  return list

def max_heapify(ary,start,end):
  root = start
  while True:
    child = root*2 + 1
    if child > end:
      break
    if child + 1 <= end and ary[child]<ary[child+1]:
      child = child + 1
    if ary[root]<ary[child]:
      ary[root],ary[child]=ary[child],ary[root]
      root=child
    else:
      break

if __name__ == '__main__':
  list=[10,23,1,53,654,54,16,646,65,3155,546,31]
  print(head_sort(list))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MiningAlgorithms 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档