Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- void swap(int &a,int &b){
- int temp = a;
- a = b;
- b = temp;
- }
- void heapsort( int *array,int n){
- int offset = 0;//смещение
- bool flag = false; // отсортированно ли данное дерево
- for(;;){
- flag = false;
- for (int i = 0; i < n; i++){
- if ((i+1)*2 + offset < n){
- if ((array[i+offset] > array[i*2+1+offset]) || (array[i+offset] > array[(i+1)*2+offset])){ // заменяем вершину дерева на наменьшего потомка
- if ( array[i*2+1+offset] < array[(i+1)*2+offset]){
- swap( array[i+offset], array[i*2+1+offset]);
- flag = true;// значит, что при данном смещение нечего сортировать
- }
- else if ( array[(i+1)*2+offset] < array[i*2+1+offset]){
- swap( array[i+offset], array[(i+1)*2+offset]);
- flag = true;
- }
- }
- if ( array[(i+1)*2+offset] < array[i*2+1+offset]){ //обрабатываем случай, когда остается последние 2 элемента в массиве
- swap( array[i*2+1+offset], array[(i+1)*2+offset]);
- flag = true;
- }
- }
- else if (i*2 + 1 + offset < n){
- if (array[i+offset] > array[i*2 +1 + offset]){
- swap( array[i+offset], array[i*2+1+offset]);
- flag = true;
- }
- }
- }
- if (!flag) // когда сортировать нечего увеличиваем смещение
- offset++;
- if (offset + 2 == n)
- break;
- }
- }
- int main(){
- int n = 10;
- int a[10] = {2, 54, 6, 64, 356, 78, 5, 78, 3, 657};
- for ( int i = 0; i < n; ++i ) { cout << a[i] << " "; }
- {heapsort(a, 10);}
- cout<<endl;
- for ( int i = 0; i < n; ++i ) cout << a[i] << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement