数据结构-堆排序(大根堆)

145 阅读1分钟
#include <iostream> 
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;
/*
堆排序
*/
void headAdjust(int a[], int k, int len){
	a[0] = a[k];
	for(int i = 2*k; i <= len; i *= 2){
		if(i<len && a[i] < a[i+1]){
			i++;
		}
		
		if(a[0] >= a[i]){
			break;
		}
		
		else{
			a[k] = a[i];
			k = i;
		}
	}
	a[k] = a[0];
}

void buildMaxHeap(int a[], int len){
	for(int i = len/2; i>0; i--){
		headAdjust(a, i, len);
	}
}

void swap(int a, int b){
	int temp = a;
	a = b;
	b = temp;
}

void heapSort(int a[], int len){
	buildMaxHeap(a, len);
	
	for(int i = len; i>1; i--){
		swap(a[i], a[1]);
		headAdjust(a, 1, i-1);
	}
}







int main(){
	int arr1[100];
	//这里使用100个随机数
	int n = 10;
	for(int i = 1; i<n ;i++){
		arr1[i] = rand();
	} 

	cout<<"100个随机数为:"<<endl;
	for(int i = 1; i<n; i++){
		cout<<arr1[i]<<" ";
	}
	cout<<endl<<"100个随机数排序之后为:"<<endl;
	
	buildMaxHeap(arr1, n);
	
	heapSort(arr1, n);
	
	

	for(int i = 1; i<n+1; i++){
		cout<<arr1[i]<<" ";
	}
	
	return 0; 
}