スタックソートアルゴリズムc++実装


ヒープの定義:
n個のキーワードシーケンスKl,K 2,...,Knをスタックと呼び、このシーケンスが以下の性質(スタック特性と略称する)を満たす場合にのみ、
(1)ki<=k(2 i+1)かつki<=k(2 i+2)(1≦i≦n)であり、もちろんこれは小根スタックであり、大根スタックは>=号に置き換える.//kiは二叉樹の非葉結点に相当し,K 2 iは左子,k 2 i+1は右子である
このシーケンスに格納されたベクトルR[1.n]を完全二叉木の格納構造と見なすと、スタックは実質的に以下の性質を満たす完全二叉木である.
ツリー内のいずれかの非リーフノードのキーワードは、その左右の子供(存在する場合)のノードのキーワードよりも大きくない(または小さくない).
ヒープのソート:
スタックソートは、選択ソートです.不安定なソート方法です.時間複雑度はO(nlogn)であった.
スタックソートの特徴は、ソート中にソート配列を完全ツリーのシーケンスストレージ構造と見なし、完全ツリーの親ノードと子ノードの内在関係を利用して、現在の無秩序領域でキーワードが最大(または最小)のレコードを選択することです.
スタック・ソートの基本思想:
  1.ソートする配列を大きなルートスタックとして作成します.大きなスタックのスタックトップ要素はこのスタックの中で最大の要素です.
  2.大きなルートスタックのスタックトップ要素と無秩序領域の最後の要素を交換し、無秩序領域の最後の位置を秩序領域にインスタンス化し、新しい無秩序領域を大きなルートスタックに調整します.無秩序領域が減少し、秩序領域が増加する操作を繰り返します.
完全なツリーの基本的な性質:
配列にはn個の要素があり,iはノードであり,1<=i<=n/2は配列の後半の要素が葉ノードである.
iの親ノード位置:i/2
i左サブノード位置:i*2
i右サブノード位置:i*2+1
次はアルゴリズム導論で与えられたアルゴリズムに従い,c++を用いてスタックソートを実現し,デバッグに合格した.
#include <iostream>
using namespace std;
int data[10]={71,18,151,138,160 ,63 ,174, 169 ,79 ,78 };
void max_heapify(int data[],int i,int heapsize)//
{
int l=2*i+1;
int r=2*i+2;
int largest=i;
if(l<heapsize&&data[l]>data[i])
{
largest=l;
}
if(r<heapsize&&data[r]>data[largest])
{
largest=r;
}
if(largest!=i)
{
int temp=data[largest];
data[largest]=data[i];
data[i]=temp;
max_heapify(data,largest,heapsize);
}
}
void bulid_max_heap(int data[],int heapsize)// , max_heapify data【1……n】 ,
{                         //
for(int i=heapsize/2-1;i>=0;i--)
max_heapify(data,i,heapsize);
}
void heap_sort(int data[],int heapsize)// : bulid_max_heap ,
{                       // data【0】 , 。
bulid_max_heap(data,heapsize);
for(int i=heapsize-1;i>0;i--)
{
int t=data[0];
data[0]=data[i];
data[i]=t;
max_heapify(data,0,i);

}
}
int main()
{
cout<<" "<<endl;
cout<<"";
for(int i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;
heap_sort(data,10);
cout<<"";
for(i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;
return 0;
}