201702(10.20.23.18)

堆排序

void Swap(int sortArr[],int i,int j){
	sortArr[i] = sortArr[i] xor sortArr[j];
	sortArr[j] = sortArr[i] xor sortArr[j];
	sortArr[i] = sortArr[i] xor sortArr[j];
}
int main()
{
	/* 第二题,堆排序算法 */
	int n = 0;
	//输入数据规模
	cin >> n;
	int elemLenth = n+1;
	int sortArr[elemLenth] = {0};
	// srand((unsigned)time(NULL)); 
	for(int i=1;i<=n;++i){
		//依次输入各个元素 
		sortArr[i] = (rand() % (2000));
	}
	//找到第一个非叶结点,开始向上调整
	int gap = 0;
	int time = elemLenth - 1;
	while(time>0){
		gap = time/2;	
		while(gap > 0){
			int lc = gap*2;
			int rc = gap*2 + 1;
			if(rc>elemLenth){
				if(sortArr[lc]<sortArr[gap]){
					Swap(sortArr,lc,gap);
				}
			}else{
				if(sortArr[lc] < sortArr[gap] && sortArr[lc] < sortArr[rc]){
					Swap(sortArr,lc,gap);
				}else if(sortArr[rc] < sortArr[gap] && sortArr[rc] < sortArr[lc]){
					Swap(sortArr,rc,gap);
				}
			}
			gap--;
		}
		printf("%d\n", sortArr[1]);
		Swap(sortArr,1,time);
		//调整完成,输出第一个元素,再将第一个元素和堆的最后一个元素交换,堆缩容
		time--;
	}

测试了一下,规模达到10000时,会乱调,和我之前一篇用java写的代码基本一样啊,为什么会乱?

import java.util.Scanner;
import java.lang.Math;

public class heapsort{
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("待排序的数字数量:");
		int n = in.nextInt();
		int heap[] = new int[n+1];//堆数组
		System.out.println("请输入待排序的数字:");
		//创建堆
		for(int i = 1;i<=n;i++) {
			heap[i] = (int)(Math.random()*1000);
	  	}
		int len = heap.length-1;
		long begin = System.nanoTime();
		alterheap(heap, len);//算法入口
		long end = System.nanoTime();
		System.out.println("time"+(end-begin));//计算排序时间
	}
	
	//调整堆
	static void alterheap(int[] heap,int l) {
		int len = l;
		while(len > 0) {
			int gap = len >> 1;
			//向上调整
			for(int i = gap;i>=1;i--) {
				if((i<<1)+1 > len)//表示只有左孩子
				{
					if(heap[i]>heap[i<<1]) {
						swap(i,i<<1,heap);
					}
				}else {
					//左右子孩子都存在,选择其中最小的一个进行交换
					boolean isLeft = heap[i<<1]<heap[(i<<1)+1]?true:false;
					if(isLeft && heap[i] > heap[i<<1]) {
						swap(i,i<<1,heap);
					}
					if(!isLeft && heap[i] > heap[(i<<1) +1]) {
						swap(i,(i<<1)+1,heap);
					}
				}
			}
			
			//调整完成,输出顶部元素
			System.out.println(heap[1]);
			//将堆顶元素和堆里最后一个元素交换,堆缩容
			swap(1,len,heap);
			len--;
		}
	}
	
	//交换元素
	static void swap(int a,int b,int[] heap) {
		heap[a] = heap[a]^heap[b];
		heap[b] = heap[a]^heap[b];
		heap[a] = heap[a]^heap[b];
	}
}


全部评论

相关推荐

10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务