重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
堆排序怎么写如下:
从策划到设计制作,每一步都追求做到细腻,制作可持续发展的企业网站。为客户提供做网站、网站设计、网站策划、网页设计、域名申请、虚拟空间、网络营销、VI设计、 网站改版、漏洞修补等服务。为客户提供更好的一站式互联网解决方案,以客户的口碑塑造优易品牌,携手广大客户,共同发展进步。
(1)用大根堆排序的基本思想
①
先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
②
再将关键字最大的记录R[1](即堆顶)和无序拆举区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个逗御誉元素为止。
(2)大根堆排序算法的基本操作:
①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2)
其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。
②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较节点i和它的孩子节点left(i),right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。调整堆的过程时山段间复杂度与堆的深度有关系,是lgn的操作,因为是沿着深度方向进行调整的。
因为char *strings[]不是指针而是指针数组,那么
temp = strings[top];
strings[top] = strings[seek];
strings[seek] = temp;
这种交换交换的就是主调函旅散洞数中的数组中的指拆枯针,把指向掘携字符串的指针顺序改变了,当然按次序输出就达到排序目的了……
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是堆排序算法:
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并竖弊散同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为 Ο(nlogn)。
1. 算法步骤
创建一个堆 H[0……n-1];
把堆首(最大值)和堆尾互换;
把堆的尺寸缩小 1,并调用 shift_down(0),目的是卜陵把新的数组顶端余氏数据调整到相应位置;
重复步骤 2,直到堆的尺寸为 1。
2. 动图演示
代码实现 JavaScript 实例 var len ; // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
function buildMaxHeap ( arr ) { // 建立大顶堆
len = arr. length ;
for ( var i = Math . floor ( len / 2 ) ; i = 0 ; i -- ) {
heapify ( arr , i ) ;
}
}
function heapify ( arr , i ) { // 堆调整
var left = 2 * i + 1 ,
right = 2 * i + 2 ,
largest = i ;
if ( left arr [ largest ] ) {
largest = left ;
}
if ( right arr [ largest ] ) {
largest = right ;
}
if ( largest != i ) {
swap ( arr , i , largest ) ;
heapify ( arr , largest ) ;
}
}
function swap ( arr , i , j ) {
var temp = arr [ i ] ;
arr [ i ] = arr [ j ] ;
arr [ j ] = temp ;
}
function heapSort ( arr ) {
buildMaxHeap ( arr ) ;
for ( var i = arr. length - 1 ; i 0 ; i -- ) {
swap ( arr , 0 , i ) ;
len --;
heapify ( arr , 0 ) ;
}
return arr ;
}
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 arr [ largest ] :
largest = left
if 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
Go 实例 func heapSort ( arr [] int ) [] int {
arrLen := len ( arr )
buildMaxHeap ( arr , arrLen )
for i := arrLen - 1 ; i = 0 ; i -- {
swap ( arr , 0 , i )
arrLen -= 1
heapify ( arr , 0 , arrLen )
}
return arr
}
func buildMaxHeap ( arr [] int , arrLen int ) {
for i := arrLen / 2 ; i = 0 ; i -- {
heapify ( arr , i , arrLen )
}
}
func heapify ( arr [] int , i , arrLen int ) {
left := 2 * i + 1
right := 2 * i + 2
largest := i
if left arrLen arr [ left ] arr [ largest ] {
largest = left
}
if right arrLen arr [ right ] arr [ largest ] {
largest = right
}
if largest != i {
swap ( arr , i , largest )
heapify ( arr , largest , arrLen )
}
}
func swap ( arr [] int , i , j int ) {
arr [ i ], arr [ j ] = arr [ j ], arr [ i ]
}
Java 实例 public class HeapSort implements IArraySort {
@Override
public int [ ] sort ( int [ ] sourceArray ) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int [ ] arr = Arrays . copyOf ( sourceArray, sourceArray. length ) ;
int len = arr. length ;
buildMaxHeap ( arr, len ) ;
for ( int i = len - 1 ; i 0 ; i -- ) {
swap ( arr, 0 , i ) ;
len --;
heapify ( arr, 0 , len ) ;
}
return arr ;
}
private void buildMaxHeap ( int [ ] arr, int len ) {
for ( int i = ( int ) Math . floor ( len / 2 ) ; i = 0 ; i -- ) {
heapify ( arr, i, len ) ;
}
}
private void heapify ( int [ ] arr, int i, int len ) {
int left = 2 * i + 1 ;
int right = 2 * i + 2 ;
int largest = i ;
if ( left arr [ largest ] ) {
largest = left ;
}
if ( right arr [ largest ] ) {
largest = right ;
}
if ( largest != i ) {
swap ( arr, i, largest ) ;
heapify ( arr, largest, len ) ;
}
}
private void swap ( int [ ] arr, int i, int j ) {
int temp = arr [ i ] ;
arr [ i ] = arr [ j ] ;
arr [ j ] = temp ;
}
}
PHP 实例 function buildMaxHeap ( $arr )
{
global $len ;
for ( $i = floor ( $len / 2 ) ; $i = 0 ; $i -- ) {
heapify ( $arr , $i ) ;
}
}
function heapify ( $arr , $i )
{
global $len ;
$left = 2 * $i + 1 ;
$right = 2 * $i + 2 ;
$largest = $i ;
if ( $left $arr [ $largest ] ) {
$largest = $left ;
}
if ( $right $arr [ $largest ] ) {
$largest = $right ;
}
if ( $largest != $i ) {
swap ( $arr , $i , $largest ) ;
heapify ( $arr , $largest ) ;
}
}
function swap ( $arr , $i , $j )
{
$temp = $arr [ $i ] ;
$arr [ $i ] = $arr [ $j ] ;
$arr [ $j ] = $temp ;
}
function heapSort ( $arr ) {
global $len ;
$len = count ( $arr ) ;
buildMaxHeap ( $arr ) ;
for ( $i = count ( $arr ) - 1 ; $i 0 ; $i -- ) {
swap ( $arr , 0 , $i ) ;
$len --;
heapify ( $arr , 0 ) ;
}
return $arr ;
}
C 实例 #include
#include
void swap ( int * a , int * b ) {
int temp = * b ;
* b = * a ;
* a = temp ;
}
void max_heapify ( int arr [ ] , int start , int end ) {
// 建立父节点指标和子节点指标
int dad = start ;
int son = dad * 2 + 1 ;
while ( son 0 ; i -- ) {
swap ( arr [ 0 ] , arr [ i ] ) ;
max_heapify ( arr , 0 , i - 1 ) ;
}
}
int main ( ) {
int arr [ ] = { 3 , 5 , 3 , 0 , 8 , 6 , 1 , 5 , 8 , 6 , 2 , 4 , 9 , 4 , 7 , 0 , 1 , 8 , 9 , 7 , 3 , 1 , 2 , 5 , 9 , 7 , 4 , 0 , 2 , 6 } ;
int len = ( int ) sizeof ( arr ) / sizeof ( * arr ) ;
heap_sort ( arr , len ) ;
int i ;
for ( i = 0 ; i
Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能。
关于sort包内的函数说明与使用,请查看
在这里简单讲几个sort包中常用的函数
在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的。
二分搜索算法
Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方液段灶法:每次只需要比较㏒₂n个元素,其中n为切片中元素的总数。
sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是闹扮升序排列,那么在判断时使用 有序切片的元素 = 目燃旁标元素。该函数返回一个int值,表示与目标元素相同的切片元素的索引。
在切片中查找出某个与目标字符串相同的元素索引