堆排序

#include<iostream>
using namespace std;
void AdjusHeap(int arr[], int i, int n) {
    int s = i;
    int x = i*2;
    int y = x+1;
    if (x < n && arr[s] < arr[x]) 
      s = x;
  if (y < n && arr[s] < arr[y])
    s = y;
  if (s != i) {
      swap(arr[i], arr[s]);
      AdjusHeap(arr, s, n);
    }
}
void BuildHeap(int arr[], int n) {
    for (int i = n/2-1; i >=0; i--)
      AdjusHeap(arr, i, n);
}
void HeapSort(int arr[], int n) {
    BuildHeap(arr, n);
    while (n > 1) {
        swap(arr[0], arr[n-1]);
        n--;
        AdjusHeap(arr, 0, n);
    }
}
int main() {
  int arr[10];
  for (int i=0; i<5; i++)
    cin>>arr[i];
  HeapSort(arr, 5);
  for (int i=0; i<5; i++)
    cout<<arr[i]<<" ";
}

 

#include<iostream>
using namespace std;
void AdjusHeap(int arr[], int i, int end){//与父节点比较 
  int x=i*2+1;//
  int y=x+1;//
  int s=i;//
  while (x<end||y<end){
    if (x<end&&arr[s]<arr[x])
      s=x;
    if (y<end&&arr[s]<arr[y])
      s=y;
    if (s!=i){
      swap(arr[i], arr[s]);
      i=s;
      x=i*2+1;
      y=x+1;
    }
    else
      break;
  }
} 
void BuildHeap(int arr[], int end){//建立树 
  for (int i=end/2-1; i>=0; i--){
    AdjusHeap(arr, i, end);
  }
}
void HeapSort(int arr[], int end){//根节点与最后一个交换 
  BuildHeap(arr, end);
  while(end>1) {
    swap(arr[0], arr[end-1]);
    end--;
    AdjusHeap(arr, 0, end);
  }    
}
int main() {
  int arr[10];
  for (int i=0; i<5; i++)
    cin>>arr[i];
  HeapSort(arr, 5);
  for (int i=0; i<5; i++)
    cout<<arr[i]<<" ";
}

 参考:http://www.cnblogs.com/Anker/archive/2013/01/23/2873422.html

posted @ 2017-03-27 19:26  白丁一枚  阅读(97)  评论(0编辑  收藏  举报