# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:Python Sorting Algorithms
# 描述: * https://www.programiz.com/dsa/counting-sort
# * https://www.geeksforgeeks.org/sorting-algorithms/
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 311
# Datetime : 2023/9/21 21:55
# User : geovindu
# Product : PyCharm
# Project : EssentialAlgorithms
# File : SortingAlgorithms.py
# explain : 学习
import tkinter as tk
from tkinter import ttk
import itertools
import math
import sys
import os
from typing import List
class SortingAlgorithms(object):
"""
排序算法
"""
def BubbleSort(array:list):
"""
1。Bubble Sort冒泡排序法
:param array int数组
:return:
"""
# loop to access each array element
for i in range(len(array)):
# loop to compare array elements
for j in range(0, len(array) - i - 1):
# compare two adjacent elements
# change > to < to sort in descending order
if array[j] > array[j + 1]:
# swapping elements if elements
# are not in the intended order
temp = array[j]
array[j] = array[j + 1]
array[j + 1] = temp
def BubbleSort2(array:list):
"""
1。Bubble Sort冒泡排序法
:param array int数组
:return:
"""
# loop through each element of array
for i in range(len(array)):
# keep track of swapping
swapped = False
# loop to compare array elements
for j in range(0, len(array) - i - 1):
# compare two adjacent elements
# change > to < to sort in descending order
if array[j] > array[j + 1]:
# swapping occurs if elements
# are not in the intended order
temp = array[j]
array[j] = array[j + 1]
array[j + 1] = temp
swapped = True
# no swapping means the array is already sorted
# so no need for further comparison
if not swapped:
break
def SelectionSort(array:list):
"""
2 python Program for Selection Sort 选择排序
:param array int数组
:return:
"""
for i in range(len(array)):
# Find the minimum element in remaining
# unsorted array
min_idx = i
for j in range(i+1, len(array)):
if array[min_idx] > array[j]:
min_idx = j
# Swap the found minimum element with
# the first element
array[i], array[min_idx] = array[min_idx], array[i]
def InsertionSort(array:list):
"""
3 Insertion Sort插入排序
:param array int数组
:return:
"""
# Traverse through 1 to len(arr)
for i in range(1, len(array)):
key = array[i]
# Move elements of arr[0..i-1], that are
# greater than key, to one position ahead
# of their current position
j = i - 1
while j >= 0 and key < array[j]:
array[j + 1] = array[j]
j -= 1
array[j + 1] = key
def Partition(array, low, high):
"""
:param array int数组
:param low:
:param high:
:return:
"""
# Choose the rightmost element as pivot
pivot = array[high]
# Pointer for greater element
i = low - 1
# Traverse through all elements
# compare each element with pivot
for j in range(low, high):
if array[j] <= pivot:
# If element smaller than pivot is found
# swap it with the greater element pointed by i
i = i + 1
# Swapping element at i with element at j
(array[i], array[j]) = (array[j], array[i])
# Swap the pivot element with
# the greater element specified by i
(array[i + 1], array[high]) = (array[high], array[i + 1])
# Return the position from where partition is done
return i + 1
def QuickSort(array, low, high):
"""
4 Quick Sort 快速排序
:param array int数组
:param low:
:param high:
:return:
"""
if low < high:
# Find pivot element such that
# element smaller than pivot are on the left
# element greater than pivot are on the right
pi = SortingAlgorithms.Partition(array, low, high)
# Recursive call on the left of pivot
SortingAlgorithms.QuickSort(array, low, pi - 1)
# Recursive call on the right of pivot
SortingAlgorithms.QuickSort(array, pi + 1, high)
def MergeSort(array:list):
"""
5 Merge Sort 合并/归并排序
:param array int数组
:return:
"""
if len(array) > 1:
# Finding the mid of the array
mid = len(array) // 2
# Dividing the array elements
L = array[:mid]
# Into 2 halves
R = array[mid:]
# Sorting the first half
SortingAlgorithms.MergeSort(L)
# Sorting the second half
SortingAlgorithms.MergeSort(R)
i = j = k = 0
# Copy data to temp arrays L[] and R[]
while i < len(L) and j < len(R):
if L[i] <= R[j]:
array[k] = L[i]
i += 1
else:
array[k] = R[j]
j += 1
k += 1
# Checking if any element was left
while i < len(L):
array[k] = L[i]
i += 1
k += 1
while j < len(R):
array[k] = R[j]
j += 1
k += 1
def CountingSort(array:list,hight:int):
"""
6 Counting Sort 计数排序
:param array int数组
:param hight 最大的整数 如100,数组中必须小数此数的整数
:return:
"""
size = len(array)
output = [0] * size
# Initialize count array
dcount = [0] * hight
# Store the count of each elements in count array
print(size)
for i in range(0, size):
dcount[array[i]] += 1
# Store the cummulative count 最大的数
for i in range(1, hight):
dcount[i] += dcount[i - 1]
# Find the index of each element of the original array in count array
# place the elements in output array
i = size - 1
while i >= 0:
output[dcount[array[i]] - 1] = array[i]
dcount[array[i]] -= 1
i -= 1
# Copy the sorted elements into original array
for i in range(0, size):
array[i] = output[i]
def CountingSortTo(array: List[int]):
"""
6 Counting Sort 计数排序
:param
:return:
"""
max = min = 0
for i in array:
if i < min:
min = i
if i > max:
max = i
count = [0] * (max - min + 1)
for j in range(max - min + 1):
count[j] = 0
for index in array:
count[index - min] += 1
index = 0
for a in range(max - min + 1):
for c in range(count[a]):
array[index] = a + min
index += 1
def countingSort(array, exp1):
"""
:param array
:param exp1:
:return:
"""
n = len(array)
# The output array elements that will have sorted arr
output = [0] * (n)
# initialize count array as 0
count = [0] * (10)
# Store count of occurrences in count[]
for i in range(0, n):
index = array[i] // exp1
count[index % 10] += 1
# Change count[i] so that count[i] now contains actual
# position of this digit in output array
for i in range(1, 10):
count[i] += count[i - 1]
# Build the output array
i = n - 1
while i >= 0:
index = array[i] // exp1
output[count[index % 10] - 1] = array[i]
count[index % 10] -= 1
i -= 1
# Copying the output array to arr[],
# so that arr now contains sorted numbers
i = 0
for i in range(0, len(array)):
array[i] = output[i]
def RadixSort(array:list):
"""
7 Radix Sort 基数排序
:param array
:return:
"""
# Find the maximum number to know number of digits
max1 = max(array)
# Do counting sort for every digit. Note that instead
# of passing digit number, exp is passed. exp is 10^i
# where i is current digit number
exp = 1
while max1 / exp >= 1:
SortingAlgorithms.countingSort(array, exp)
exp *= 10
def insertionSort(array:list):
"""
:return:
"""
for i in range(1, len(array)):
up = array[i]
j = i - 1
while j >= 0 and array[j] > up:
array[j + 1] = array[j]
j -= 1
array[j + 1] = up
return array
def BucketSort(array):
"""
8 Bucket Sort 桶排序
:param array
:return:
"""
arr = []
slot_num = 10 # 10 means 10 slots, each
# slot's size is 0.1
for i in range(slot_num):
arr.append([])
# Put array elements in different buckets
for j in array:
index_b = int(slot_num * j)
arr[index_b].append(j)
# Sort individual buckets
for i in range(slot_num):
arr[i] = SortingAlgorithms.insertionSort(arr[i])
# concatenate the result
k = 0
for i in range(slot_num):
for j in range(len(arr[i])):
array[k] = arr[i][j]
k += 1
return array
# Bucket Sort in Python
def BucketSortTo(array:list):
"""
8 Bucket Sort 桶排序
:param array
:return:
"""
bucket = []
# Create empty buckets
for i in range(len(array)):
bucket.append([])
# Insert elements into their respective buckets
for j in array:
index_b = int(10 * j)
bucket[index_b].append(j)
# Sort the elements of each bucket
for i in range(len(array)):
bucket[i] = sorted(bucket[i])
# Get the sorted elements
k = 0
for i in range(len(array)):
for j in range(len(bucket[i])):
array[k] = bucket[i][j]
k += 1
return array
def heapify(array:list, Nsize:int, index:int):
"""
:param array 数组
:param Nsize: 数组长度
:param index: 索引号
:return:
"""
largest = index # Initialize largest as root
l = 2 * index + 1 # left = 2*i + 1
r = 2 * index + 2 # right = 2*i + 2
# See if left child of root exists and is
# greater than root
if l < Nsize and array[largest] < array[l]:
largest = l
# See if right child of root exists and is
# greater than root
if r < Nsize and array[largest] < array[r]:
largest = r
# Change root, if needed
if largest != index:
array[index], array[largest] = array[largest], array[index] # swap
# Heapify the root.
SortingAlgorithms.heapify(array, Nsize, largest)
# The main function to sort an array of given size
def HeapSort(array:list):
"""
9 Heap Sort 堆排序
:param array
:return:
"""
Nsize = len(array)
# Build a maxheap.
for i in range(Nsize // 2 - 1, -1, -1):
SortingAlgorithms.heapify(array, Nsize, i)
# One by one extract elements
for i in range(Nsize - 1, 0, -1):
array[i], array[0] = array[0], array[i] # swap
SortingAlgorithms.heapify(array, i, 0)
def ShellSort(array:list):
"""
10 Shell Sort 希尔排序
:param array 数组
:return:
"""
# code here
nszie=len(array)
gap = nszie // 2
while gap > 0:
j = gap
# Check the array in from left to right
# Till the last possible index of j
while j < nszie:
i = j - gap # This will keep help in maintain gap value
while i >= 0:
# If value on right side is already greater than left side value
# We don't do swap else we swap
if array[i + gap] > array[i]:
break
else:
array[i + gap], array[i] = array[i], array[i + gap]
i = i - gap # To check left side also
# If the element present is greater than current element
j += 1
gap = gap // 2
def LinearSearch(array:list,fint:int):
"""
11 Linear Search线性搜索
:param array 整数数组
:param fint 要查找的数字
:return:
"""
nsize=len(array)
# Going through array sequencially
for i in range(0, nsize):
if (array[i] == fint):
return i #找到了
return -1 #未找到
def BinarySearch(array:list, x, low, high):
"""
12 Binary Search 二分查找
:param x:
:param low:
:param high:
:return:
"""
if high >= low:
mid = low + (high - low) // 2
# If found at mid, then return it
if array[mid] == x:
return mid
# Search the left half
elif array[mid] > x:
return SortingAlgorithms.BinarySearch(array, x, low, mid - 1)
# Search the right half
else:
return SortingAlgorithms.BinarySearch(array, x, mid + 1, high)
else:
return -1
def BingoSort(array, size):
"""
:param array
:param size:
:return:
"""
# Finding the smallest element From the Array
bingo = min(array)
# Finding the largest element from the Array
largest = max(array)
nextBingo = largest
nextPos = 0
while bingo < nextBingo:
# Will keep the track of the element position to
# shifted to their correct position
startPos = nextPos
for i in range(startPos, size):
if array[i] == bingo:
array[i], array[nextPos] = array[nextPos], array[i]
nextPos += 1
# Here we are finding the next Bingo Element
# for the next pass
elif array[i] < nextBingo:
nextBingo = array[i]
bingo = nextBingo
nextBingo = largest
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 311
# Datetime : 2023/9/21 22:00
# User : geovindu
# Product : PyCharm
# Project : EssentialAlgorithms
# File : SortingExample.py
# explain : 学习
import ChapterOne.SortingAlgorithms
class Example(object):
""""
实例
"""
def Bubble(self):
"""
1。Bubble Sort冒泡排序法
:return:
"""
data = [-2, 45, 0, 11, -9]
ChapterOne.SortingAlgorithms.SortingAlgorithms.BubbleSort(data)
print('\n1 冒泡排序法 Bubble Sorted Array in Ascending Order:')
for i in range(len(data)):
print("%d" % data[i], end=" ")
def Select(self):
"""
2 Selection Sort 选择排序
:return:
"""
geovindu = [64, 25, 12, 22, 11]
ChapterOne.SortingAlgorithms.SortingAlgorithms.SelectionSort(geovindu)
print("\n2 选择排序Selection Sorted ")
for i in range(len(geovindu)):
print("%d" % geovindu[i], end=" ")
def Insert(self):
"""
3 Insertion Sort插入排序
:return:
"""
arr = [12, 11, 13, 5, 6]
ChapterOne.SortingAlgorithms.SortingAlgorithms.InsertionSort(arr)
print("\n3 插入排序 Insertion Sorted ")
for i in range(len(arr)):
print("% d" % arr[i], end=" ")
def Quick(self):
"""
4 Quick Sort 快速排序
:return:
"""
array = [10, 7, 8, 9, 1, 5]
N = len(array)
# Function call
ChapterOne.SortingAlgorithms.SortingAlgorithms.QuickSort(array, 0, N - 1)
print("\n4 快速排序 Quick Sorted ")
for x in array:
print(x, end=" ")
def Merge(self):
"""
5 Merge Sort 合并/归并排序
:return:
"""
geovindu = [12, 11, 99, 13, 5, 6, 7,88,100]
ChapterOne.SortingAlgorithms.SortingAlgorithms.MergeSort(geovindu)
print("\n5 合并/归并排序 Merge Sorted ")
for x in geovindu:
print(x, end=" ")
def Counting(self):
"""
6 Counting Sort 计数排序
:return:
"""
geovindu = [17, 56, 71, 38, 61, 62, 48, 28, 57, 42]
ChapterOne.SortingAlgorithms.SortingAlgorithms.CountingSortTo(geovindu)
print("\n6 计数排序 Counting Sorted ")
print(geovindu)
for i in range(0,len(geovindu)):
print("% d" % geovindu[i], end=" ")
geovindu = [4, 55, 22, 98, 9, 43, 11]
ChapterOne.SortingAlgorithms.SortingAlgorithms.CountingSort(geovindu, 100)
print("\n6 计数排序 Counting Sorted ")
for x in geovindu:
print(x, end=" ")
def Radix(self):
"""
7 Radix Sort 基数排序
:return:
"""
geovindu = [170, 45, 75, 90, 802, 24, 2, 66]
print("\n7 基数排序 Radix Sorted ")
# Function Call
ChapterOne.SortingAlgorithms.SortingAlgorithms.RadixSort(geovindu)
for i in range(len(geovindu)):
print(geovindu[i], end=" ")
def Bucket(self):
"""
8 Bucket Sort 桶排序
:return:
"""
#geovindu = [170, 45, 75, 90, 802, 24, 2, 66]
geovindu = [0.897, 0.565, 0.656,
0.1234, 0.665, 0.3434]
print("\n8 桶排序 Bucket Sorted ")
# Function Call
du=ChapterOne.SortingAlgorithms.SortingAlgorithms.BucketSort(geovindu)
for i in range(len(du)):
print(du[i], end=" ")
def Heap(self):
"""
9 Heap Sort 堆排序
:return:
"""
geovindu = [170, 45, 75, 90, 802, 24, 2, 66]
print("\n9 堆排序 Heap Sorted ")
# Function Call
ChapterOne.SortingAlgorithms.SortingAlgorithms.HeapSort(geovindu)
for i in range(len(geovindu)):
print(geovindu[i], end=" ")
def Shell(self):
"""
10 Shell Sort 希尔排序
:return:
"""
geovindu = [170, 45, 75, 90, 802, 24, 2, 66]
print("\n10 希尔排序 Shell Sorted ")
# Function Call
ChapterOne.SortingAlgorithms.SortingAlgorithms.ShellSort(geovindu)
for i in range(len(geovindu)):
print(geovindu[i], end=" ")
def Linear(self):
"""
11 Linear Search 线性搜索
:return:
"""
array = [2, 4, 8,0, 1, 9]
x = 8
n = len(array)
result = ChapterOne.SortingAlgorithms.SortingAlgorithms.LinearSearch(array,x)
print("\n11 线性搜索 Linear Search ")
if (result == -1):
print("Element not found")
else:
print("Element found at index: ", result)
def Binary(self):
"""
12 Binary Search 二分查找
:return:
"""
array = [3, 4, 5, 6, 7, 8, 9]
x = 4
result = ChapterOne.SortingAlgorithms.SortingAlgorithms.BinarySearch(array, x, 0, len(array) - 1)
print("\n12 二分查找 Binary Search ")
if result != -1:
print("Element is present at index " + str(result))
else:
print("Not found")
def Bingo(self):
"""
13 Bingo Sort
:return:
"""
arr = [5, 4, 8, 5, 4, 8, 5, 4, 4, 4]
ChapterOne.SortingAlgorithms.SortingAlgorithms.BingoSort(arr, size=len(arr))
print("\n13 Bingo Sorted ")
for i in range(len(arr)):
print(arr[i], end=" ")
调用:
exm=BLL.SortingExample.Example()
exm.Bubble()
exm.Select()
exm.Insert()
exm.Quick()
exm.Merge()
exm.Counting()
exm.Radix()
exm.Bucket()
exm.Heap()
exm.Shell()
exm.Linear()
exm.Binary()
exm.Bingo()