堆排序

      #include <stdio.h>
	#include <stdlib.h>
	
	//堆排序,查找最大值,最小值速度最快
	//取最大值,取最小值怎么写
	//大顶堆,小顶堆。
	
	
	void show(int *p, int n)
	{
		for (int i = 0; i < n;i++)
		{
			printf("%4d", p[i]);
		}
		printf("\n");
	
	}
	
	
	void findmax(int *arr,int size)
	{
	
		printf("start:%d\n",size);
		for (int j = size - 1; j > 0;j--)//从尾部循环到头部 ,自下而上
		{
			int parent = j / 2;
			int child = j; //记录当前下标
	
			if (j<size -1  && arr[j]<arr[j+1]) //用该方式取出左右两个值中的最大值
			{
				child++;
			}
			if (arr[child] > arr[parent])//最大值登顶
			{
				int temp = arr[child];
				arr[child] = arr[parent];
				arr[parent] = temp;
			}
			printf("j=%d\n", j);
			printf("parent=%d\n", parent);
			printf("child=%d\n", child);
		}
	}
	
	void heapsortbyaddr(int *arr, int size)//地址变化,长度变化
	{
		for (int i = 0; i < 10;i++)
		{
			findmax(arr+i, size-i); //
			show(arr, 10);
		}
	}
	
	
	void  heapsort(int *arr, int size)//地址固定,额外交换数据
	{
		for (int j = size; j > 0;j--)
		{
			findmax(arr, j);
			show(arr, 10);
	
			int temp = arr[0];
			arr[0] = arr[j - 1];
			arr[j - 1]=temp;
	
			show(arr, 10);
		}
	}
	
	void main()
	{
		int a[10] = { 10, 13, 120, 12, 30, 114, 50, 19, 60, 29 };
		//show(a, 10);
		//findmax(a, 10);
		show(a, 10);
		show(a, 10);
		heapsortbyaddr(a, 10);
		show(a, 10);
	
		system("pause");
	}
posted @ 2016-11-19 16:04  呉语伦比  阅读(128)  评论(0)    收藏  举报