파이썬 알고리즘 다이어그램 - 신속하게 정렬하고 정렬 선택

저작권 : 얕은 @ 저작권 원본 문서는 허가없이 복제 할 수 없습니다 https://blog.csdn.net/xili2532/article/details/91372648

분할 통치

잘 알려진 재귀 문제 해결 :분할 통치. (분할 정복하고, D & C ).
작품 D & C의 :
(1) 간단한 기본 조건을 식별,
(2)이 기준 조건에 맞도록 문제의 규모를 줄이는 방법을 결정하는
기본 조건 요구를 :재귀 함수의 어레이의 제조에 관한 것으로, 상기 어레이의 초기 조건은 일반적으로 비어 있거나 단지 하나 개의 요소를 포함. 문제가 확인되면 기본 조건은 아니다.
실시 예 1 : 목록에 포함 된 소자의 수를 계산하는 재귀 함수를 작성

def sum(list):
    if list == []:
        return 0
    else:
        return list[0] + sum(list[1:])

두 결합 된 목록에 직접 추가 할 수 있습니다

빠른 정렬

사상 분할 통치의 빠른 정렬에서
: 빠르게 정렬 단계
(1) 상기 기준 값을 선택한다.
2 개의 서브 어레이로 배열 : 소자는 기준값보다 작고, 상기 기준 값은 요소보다 크다.
(3)이 두 개의 하위 배열은 신속하게 분류.
: 빠른 정렬 (재귀를 사용하는 아이디어)로서는
단순한 알고리즘 설명 : 어레이 비트 기준값의 첫 번째 요소를 선택하여 새로운 두 배열은 기준치보다 기준치보다 큰 요소에 저장된 만든다. 어레이가 비어있을 때까지 두 개의 새로운 배열을 반복적 조작 상술. 기준값이어서 어레이를 접합 남아

def quicksort(array):
  if len(array) < 2:
    # 基线条件:为空或只包含一个元素的数组是“有序”的
    return array
  else:
    pivot = array[0]
    # 由所有小于基准值的元素组成的子数组
    less = [i for i in array[1:] if i <= pivot]
    # 由所有大于基准值的元素组成的子数组
    greater = [i for i in array[1:] if i > pivot]

    return quicksort(less) + [pivot] + quicksort(greater)

선택 정렬

선택 분류 단계 : 이송은 최소값을 발견하고, 그 후, 새로운리스트에 추가 사이클
해당 위치에 각각의 선택 소자를 최소

@pysnooper.snoop()
def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index


@pysnooper.snoop()
def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

print(selectionSort([5, 3, 6, 2, 10]))

버블 정렬

인접 요소 비교 선택된 최대의 각 요소는, 비교를 위해, 가장 큰 요소는 따라서 상단에 도달 한 위치에서, 기포와 동일 할 수있다.
: 거품 정렬 알고리즘의 동작은 다음과 같다
① 인접 요소를 비교한다. (승순) 번째보다 큰 첫 번째 경우, 그들 중 둘은 교환했다. 처음부터 마지막 쌍의 상기 제의 단부에 인접 요소들의 각 쌍에 대해 동일한 작업을 수행. 이 작업이 완료되면, 마지막 요소는 가장 큰 수이다.
② 마지막 하나를 제외한 모든 요소에 대해 위의 단계를 반복합니다. 비교 할 필요가 없어 질 때까지 때마다 줄어들고 요소, 한 쌍의 숫자에 대해 위의 단계를 반복하는 것을 계속했다.

@pysnooper.snoop()
def bubble_sort(alist):
    for j in range(len(alist) - 1, 0, -1):
        # j表示每次遍历需要比较的次数,是逐渐减小的
        for i in range(j):
            if alist[i] > alist[i + 1]:
                # 大的话交换位置
                alist[i], alist[i + 1] = alist[i + 1], alist[i]

li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubble_sort(li)
print(li)

삽입 정렬

어레이가 두 전방 및 후방 부분으로 분할되고, 요소의 세트의 전방 부분이 정렬되어, 요소들의 집합은 정렬되지의 일부이다. 각 정렬되지 않은 첫 번째 배열을 선택하고, 모음의 적절한 위치에 삽입 소트.
작업 원리 : 의해 순서화 시퀀스의 구축, 정렬되지 않은 데이터의 위치를 비교하여 표리, 즉에 정렬 된 순서로 스캔 해당 인서트를 찾는. 삽입 정렬의 실현에있어서, 위로부터 스캔 과정에서 전방으로, 필요성이 점차 반복 새로운 요소의 삽입을위한 공간을 제공하기 위해 위치를 다시 이동 요소를 지시한다.그리고 유사한 거품 정렬

여기에 그림 삽입 설명

def insert_sort(alist):
    # 从第二个位置,即下标为1的元素开始向前插入
    for i in range(1, len(alist)):
        # 从第i个元素开始向前比较,如果小于前一个元素,交换位置
        for j in range(i, 0, -1):
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
insert_sort(alist)
print(alist)

쉘 정렬

셸 정렬 삽입 정렬, 삽입 정렬, 현재 및 이전의 비교의 각 요소의 각 요소를 최적화하고 삽입 셸 정렬, 첫 번째 단계, 어레이 그룹, 각각의 그룹에 대응하는 소정의 길이에 따라 삽입 정렬, 당신은 마지막으로 중요한 데이터의 분포를 조정하고, 할 수 있도록이 세밀하게 조정하기 위해 빠른 정렬을 수행하는
기본적인 아이디어 : 각각의 테이블 및 삽입 정렬 컬럼의 열 배열을이 과정을 반복하지만, 더 매번 컬럼 길이 (긴 스텝 크기, 적은 열 번호)를 행한다. 마지막으로, 전체 테이블 중 하나입니다. 배열을, 더 나은이 알고리즘을 이해하기 위해 알고리즘 자체를 테이블에 배열을 변환하거나 사용하는 정렬 할 수 있습니다.

우리는 단계는 5 종류입니다 시작하는 경우 예를 들어, 숫자 [1,314,943,382,255,994 6,523,452,773,253,910]의 같은 세트가있는 가정, 우리는 5이 목록에 놓여있다 테이블이 더 나은 알고리즘을 설명하기 위해, 그래서 그들은 (수직 요소 단계로 구성되어있다)과 같아야합니다 :

def shell_sort(alist):
    n = len(alist)
    # 初始步长
    gap = int(n / 2)
    while gap > 0:
        # 按步长进行插入排序
        for i in range(gap, n):
            j = i
            # 插入排序
            while j >= gap and alist[j - gap] > alist[j]:
                alist[j - gap], alist[j] = alist[j], alist[j - gap]
                j -= gap
        # 得到新的步长
        gap = int(gap / 2)
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shell_sort(alist)
print(alist)

일종의 병합

하향식 : 재귀 다음 배열 병합 분해에 의해 제 배열
알고리즘에 대한 간략한 설명이다 :
  분해 어레이 : 길이 1의 배열, 두 부분으로 배열 중간체의 분해가 계속되면
  융합 분해 어레이를 만들기 위해, : 배열 병합 새로운 어레이는 어레이 소자 수납 통합된다. 전체 배열 요소가 제거 될 때까지 소자의 크기에 대한 포인터의 현재 위치를 비교하여, 처음 두 어레이 포인터 좌표를 생성하기 위해 더 작은 배열에 새로운 요소 포인터가 후방으로 이동된다. 마지막 두 어레이 검사는, 소자는 새로운 배열에 추가하고, 마지막으로 정렬 된 배열에 대응하는 위치에 따라 정렬되도록 배열에 저장되어 제거되지 않는다.
  
여기에 그림 삽입 설명

def merge_sort(alist):
    if len(alist) <= 1:
        return alist
    # 二分分解
    num = int(len(alist) / 2)
    left = merge_sort(alist[:num])
    right = merge_sort(alist[num:])
    # 合并
    return merge(left, right)

def merge(left, right):
    '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组'''
    # left与right的下标指针
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
sorted_alist = merge_sort(alist)
print(sorted_alist)

링크 : 여러 정렬 알고리즘 .

추천

출처blog.csdn.net/xili2532/article/details/91372648