堆排序算法实现(javascript语言)

堆排序算法实现(javascript语言)

1、二叉堆的性质
2、堆排序原理
3、javascript代码:

//堆中某节点按升序或者降序递归下沉
//author:	Hengda
//arr: 	待排序数组
//nodeNo: 	二叉树中指定节点的序号/堆数组中的下标
//heapLen:	堆的长度
//mode: 	true 大的下沉,false 小的下沉
function heapNodeSink( arr, nodeNo, heapLen, mode ){
     

	var leftChild = ( nodeNo + 1 ) * 2 - 1;	//做孩子
	var rightChild = leftChild + 1;			//右孩子
	var maxminNo = nodeNo;					//最大值的序号
	var temp;								//用于变量值的交换

	if( mode ){
     
		//
		if( heapLen > leftChild && arr[ maxminNo ] > arr[ leftChild ] ){
     
			maxminNo = leftChild;//更新最大节点序号
		}
		if( heapLen > rightChild && arr[ maxminNo ] > arr[ rightChild ] ){
     
			maxminNo = rightChild;//更新最大节点序号
		}
	}else{
     
		if( heapLen > leftChild && arr[ maxminNo ] < arr[ leftChild ] ){
     
			maxminNo = leftChild;//更新最大节点序号
		}
		if( heapLen > rightChild && arr[ maxminNo ] < arr[ rightChild ] ){
     
			maxminNo = rightChild;//更新最大节点序号
		}
	}

	//最大值所在节点有变化,则交换
	if( maxminNo != nodeNo ){
     

		//交换
		temp = arr[ maxminNo ];
		arr[ maxminNo ] = arr[ nodeNo ];
		arr[ nodeNo ] = temp;

		//继续下沉操作
		heapNodeSink( arr, maxminNo, heapLen, mode );
	}
}

//功能:		堆排序
//author: 	Hengda
//arr: 	待排序数组
//mode: 	true 从大到小排序,false 从小到大排序
function heapSort( arr, mode ){
     
	var len = arr.length;	//数组的长度
	var temp;				//用于交换节点值
	var endHeapNodeNo;		//堆末尾节点在数组中的下标

	//将数组调整为二叉堆
	for( var i = Math.floor( len / 2 ) - 1; i >= 0; i-- ){
     
		heapNodeSink( arr, i, len, mode );
	}

	for( var heapLen = len; heapLen > 0; heapLen-- ){
     
		endHeapNodeNo = heapLen - 1;//堆的最后一个节点的序号

		//交换堆顶和堆尾元素
		temp = arr[ endHeapNodeNo ];
		arr[ endHeapNodeNo ] = arr[ 0 ];
		arr[ 0 ] = temp;

		//对除了堆尾元素组成的堆进行堆顶下沉操作
		heapNodeSink( arr, 0,  heapLen - 1, mode );
	}
	return arr;
}

注意:
堆是父节点总大于等于 或 小于等于孩子节点的一个完全二叉树;
堆中删除节点,是从堆顶操作;
插入节点是从堆尾操作;
插入元素后,需要上浮新插入的元素,使其重新满足堆的性质;
堆顶元素更换后,需要下沉堆顶元素直到满足堆的性质。

测试 排序100万个随机数

//测试数据生成函数
//author:Hengda
//n是需要生成的个数
//随机生成有n个元素的没有顺序的大小顺序的数组
function makeData( n ){
     
	var dt = [];
	var i = n;
	while( i-- ){
     
		dt.push( Math.floor( Math.random() * n ) );
	}
	return dt;
}

//测试

//生成100万个随机数数据
arr = makeData(1000000);

console.log("100万条数据:");
console.log(arr);
arrJsonStr = JSON.stringify( arr );

//升序排序
arr1 = JSON.parse( arrJsonStr );//复制数据到arr1
console.time( '堆排序_升序_耗时' );
arr1 = heapSort( arr1, false );
console.timeEnd( '堆排序_升序_耗时' );
console.log( arr1.toString() );

//降序排序
arr2 = JSON.parse( arrJsonStr );//复制数据到arr2
console.time( '堆排序_降序_耗时' )
arr2 = heapSort( arr2, true );
console.timeEnd( '堆排序_降序_耗时' );
console.log( arr2.toString() );

堆排序算法实现(javascript语言)_第1张图片

你可能感兴趣的:(排序算法,Javascript,堆排序,数据结构,排序算法,算法,javascript)