十大经典排序算法5(Python版本)
十大经典排序算法5(Python版本)
文章目录
七、堆排序
八、计数排序
七、堆排序
1、堆排序介绍
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为 Ο(nlogn)。
2、算法步骤
创建一个堆 H[0……n-1];
把堆首(最大值)和堆尾互换;
把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
重复步骤 2,直到堆的尺寸为 1。
3、动图演示
4、Python练习
def buildMaxHeap(arr):
import math
for i in range(math.floor(len(arr)/2),-1,-1):
heapify(arr,i)
def heapify(arr, i):
left = 2*i+1
right = 2*i+2
largest = i
if left < arrLen and arr[left] > arr[largest]:
largest = left
if right < arrLen and arr[right] > arr[largest]:
largest = right
if largest != i:
swap(arr, i, largest)
heapify(arr, largest)
def swap(arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
def heapSort(arr):
global arrLen
arrLen = len(arr)
buildMaxHeap(arr)
for i in range(len(arr)-1,0,-1):
swap(arr,0,i)
arrLen -=1
heapify(arr, 0)
return arr
八、计数排序
1、计数介绍
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
2、动图演示
3、Python练习
def countingSort(arr, maxValue):
bucketLen = maxValue+1
bucket = [0]*bucketLen
sortedIndex =0
arrLen = len(arr)
for i in range(arrLen):
if not bucket[arr[i]]:
bucket[arr[i]]=0
bucket[arr[i]]+=1
for j in range(bucketLen):
while bucket[j]>0:
arr[sortedIndex] = j
sortedIndex+=1
bucket[j]-=1
return arr
文章转载于:
十大经典排序算法(Python)
十大经典排序算法5(Python版本)相关教程
手撸几个基础算法1- 快速排序、归并排序、二分
手撸几个基础算法1- 快速排序、归并排序、二分 快速排序:给定一组数字,实现快速排序。 时间复杂度: O(nlogn) n: 表示每次对n的数字进行排列; logn: 表示将分支将n个元素划分品骏需要logn次 #include iostreamusing namespace std;const int N = 100010
插入排序(思路分析+疑惑解析)
插入排序(思路分析+疑惑解析) 思路及疑惑后的思考解答 package sort;import java.util.Arrays; /** * 插入排序(Insertion Sorting)的基本思想是: * 把n个待排序的元素看成为一个有序表和一个无序表 * 开始时有序表中只包含一个元素,无序表中包含有n-1个
八大排序算法总结 更新中·······
八大排序算法总结 更新中······· 稳定记忆方法: 时间和空间复杂度记忆: 代码: #includeiostream#includecstdiousing namespace std;int A[10]={1,10,2,9,3,8,4,7,5,0};/*void InsertSort(int A[],int n)///直接插入排序 稳定 最好时间复杂度O(n) 平
原创 js实现各种排序算法——插入排序(二)
原创 js实现各种排序算法——插入排序(二) 插入排序: 图解: function insertSort(arr){ for(let i=1;iarr.length;i++){ let j=i-1;//已排序列最后一个元素下标 let temp=arr[i];//待排序列的第一个元素 while(j=0arr[j]temp){//找到插入位置:j+1 arr[j+1]
java实现网络编程之 经典TCP通信实战练习(超详细)
java实现网络编程之 经典TCP通信实战练习(超详细) 模拟tcp通信: 一个客户端的类,一个服务器端的类 下面看下具体实现: 客户端代码: package network;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.n
使用sql进对数据库表数据进行先分组后排序
使用sql进对数据库表数据进行先分组后排序 在实际业务中,有一些场景需要对一组列表数据 先分组后然后组内排序 ,这时不能单纯的使用传统的 group by 和 order by 语句了,因为会提示 xxxx字段必须在group by聚合函数中 ,为了解决此问题,我们可以使用 ROW_NU
Java实现希尔排序(缩小增量排序)
Java实现希尔排序(缩小增量排序) 1.我们来看简单插入排序可能存在的问题: 数组arr={2,3,4,5,6,1},这时需要插入的数1(最小),这个过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3
排序——归并排序
排序——归并排序 定义: 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若