堆的建立,插入和自动排序

在网上看的代码基本上都是这样的:

#include<iostream>
using namespace std;

void MakeHeap (int a[], int n);

int
main ()
{
  int a[100];
  int n, i;

  cout << "Enter the number:" << endl;
  cin >> n;

  for (i = 1; i <= n; i++)
    {
      cout << "Enter the element of the Heap:" << endl;
      cin >> a[i];
    }

  MakeHeap (a, n);

  cout << "The Heap is:" << endl;
  for (i = 1; i <= n; i++)
    {
      cout << a[i] << " ";
    }

  cout << endl;

  return 1;
}

void
MakeHeap (int a[], int n)
{
  int i, j, flag;

  for (i = n / 2; i >= 1; i--)
    {
      j = 2 * i;
      if (a[j] <= a[j + 1])
    j++;
      if (a[i] < a[j])
    {
      flag = a[i];
      a[i] = a[j];
      a[j] = flag;
    }
    }
}



但是我总感觉不太对,所以就拿这个运行了一下,结果真的是错的,他这里只是实现了一步而已。也许是我没搞明白他的意思吧。

所以我自己实现了一个简单的,没考虑算法复杂度(特别是堆的建立,堆的排序还是挺简单的)。

基础:堆的建立过程复杂度为:O(n),而不是O(nlogn);这个是有证明的。

堆排序时间是由建立初始化堆和反复重建堆这两部分的时间开销构成

所以建立堆的过程不是这样的:

-----------------------------------------------------------------------------------------------------

1 个元素是一个堆

2 个元素时, 交换元素2与堆顶, 调整

3 个元素时, 交换元素3与堆顶, 调整

4 个元素时, 交换元素4与堆顶, 调整

一直到数组末尾, 于是整个数组就成为一个堆了。

-----------------------------------------------------------------------------------------------------

而是这样的:从n/2元素开始, 以该点为根,使之成为一个堆; 然后再以n/2-1元素开始, 使之成为一个堆;,, 一直到数组第1个元素,使之成为一个堆; 于是整个数组就成为一个堆了。

这里是很容易搞糊涂的地方。

 

#include<iostream>
using namespace std;

int data[100];
int count;
void printList(int data[],int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		cout<<data[i]<<" ";
	}
	cout<<endl;
}

void swap(int& first,int& second )
{
	int temp=first;
	first=second;
	second=temp;
}

void HeapSortUp(int* data,int position)
{
	if(position<=0)
		return;
	if(data[position]>data[(position-1)/2])
	{
		swap(data[position],data[(position-1)/2]);
		HeapSortUp(data,(position-1)/2);
	}
}

void insert(int* data,int value)
{
	data[count++]=value;
	HeapSortUp(data,count-1);
}

void HeapSortDown(int a[],int position,int size)
{
	bool isChange=true;
	while(isChange)
	{
		if(position>(size-2)/2)
			return;
		int j=2*position+1;
		if(a[j]<a[size-1])
			j=size-1;
		if(a[position]<a[j])
		{
			swap(a[position],a[j]);
			isChange=true;
		}
		else
			isChange=false;
		position=j;
	}
}

void pop(int data[],int size)
{
	cout<<data[0]<<endl;	
	swap(data[0],data[size-1]);
	--count;
	HeapSortDown(data,0,count);
}
void BuildBigHeap(int data[],int size)
{
	
	int i;
	for(i=(size-2)/2;i>=0;--i)
	{
		HeapSortDown(data,i,size);
	}
	
}
void main()
{	
	cout<<"请输入count的值:";
	cin>>count;
	cout<<endl;
	int i;
	for(i=0;i<count;i++)
	{
		cout<<"请输入第"<<i<<"个值: ";
		cin>>data[i];
		cout<<endl;
	}
	printList(data,count);

	BuildBigHeap(data,count);
	printList(data,count);

	insert(data,7);
	printList(data,count);

	pop(data,count段落标签);
	printList(data,count);
	return;
}


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值