堆排序、归并、快排、BSTree

//QuickSort
void QuickSort(int* a, int low, int high)
{
int mid = low;
if(low < high)
{
mid = Partition(a, low, high);
QuickSort(a, low, mid-1);
QuickSort(a, mid+1, high);
}



}

int Partition(int* a, int low, int high)
{
int base = a[low];
while(low < high)
{
while(a[high] > base && low < high )
{
--high;
}
swap(&a[high], &a[low]);
while(a[low]<base && low < high)
{
++low;
}
swap(&a[high], &a[low]);


}
return low;
}


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

*a = *b;
*b = temp;
}


//HeapSort
void HeapSort(int a[], int len)
{
for(int i=len/2-1;i>=0;--i)  //i为数组中的序号
{
HeapAdjust(a, i, len-1);
}

swap(&a[0], &a[len-1]);
for(int i=len-1;i>0;--i)
{
HeapAdjust(a, 0, i-1);
swap(&a[0], &a[i-1]);


}

}


void HeapAdjust(int* a, int beg, int end)
{
if(!a || beg<0 || end<0 || beg>end)
{
return;
}
int nLeft = beg*2;
int nRight = beg*2+1;
int temp = 0;


for(int i=beg+1;2*i<=end+1;)   //i nLeft nRight 为树中序号
{
nLeft = i*2;
nRight = i*2+1;
if(nLeft-1<=end && a[i-1] < a[nLeft-1])
{
swap(&a[i-1], &a[nLeft-1]);
i = nLeft;
}
if(nRight-1<=end && a[i-1] < a[nRight-1])
{
swap(&a[i-1], &a[nRight-1]);
i = nRight;
}
if(2*i < nRight)
{
i *=2;
}
}
}


///MergeSort///
void MergeSort(int* b, int* a, int i, int n)
{
if(a==NULL  || i-n>0)
return;
int temp[MAX_SIZE] = {0};
if(i==n)
{
a[i] = b[i];
}
else
{
int m = (i+n)/2;
MergeSort(b, temp, i, m);
MergeSort(b, temp, m+1, n);
Merge(temp, a, i,m, n);
}


}

void Merge(int* b, int* a, int i, int m, int n)
{
int k, j, s;
k = j = s = 0;
for(k = i,j=m+1;i<=m && j<=n;k++)
{
if(b[i]<b[j])
{
a[k] = b[i];
i++;
}
else
{
a[k] = b[j];
j++;
}
}
if(i<=m)
{
while(i<=m)
{
a[k] = b[i++];
k++;
}
}
if(j<=n)
{
while(j<=n)
{
a[k] = b[j++];
k++;
}
}
}


//

///BSTree
void InitBSTree(PBSTree &root)
{
root = NULL;
cout << "successfully initial"<<endl;
}


bool SearchBSTree(PBSTree &t, int key , PBSTree parent, PBSTree &k)
{
if(!t)
{
k = parent;
return false;
}
if(key == t->data)
{
k = t;
return true;
}
else if(key < t->data)
{
return SearchBSTree(t->left, key, t,k);
}
else
{
return SearchBSTree(t->right, key, t,k);
}





}

bool InsertBSTree(PBSTree &root, int key)
{
PBSTree p = NULL;
PBSTree pNode = NULL;


if(!SearchBSTree(root, key, NULL,p))
{
pNode = new BSTreeNode;
pNode->data = key;
pNode->left = pNode->right = NULL;


if(!p)
{
root = pNode;

}
else
{
if(key < p->data)
{
p->left = pNode;
}
else
{
p->right = pNode;
}
}
return true;
}
else
{
return false;
}
}

void InOrderTraverse(PBSTree t)
{
if(!t)
{
return;
}

InOrderTraverse(t->left);
cout << t->data << endl;
InOrderTraverse(t->right);
}

void PreOrderTraverse(PBSTree t)
{
if(!t)
{
return;
}


cout << t->data << endl;
PreOrderTraverse(t->left);
PreOrderTraverse(t->right);
}

void PostOrderTraverse(PBSTree t)
{
if(!t)
{
return;
}


PostOrderTraverse(t->left);
PostOrderTraverse(t->right);
cout << t->data << endl;
}

bool DeleteBSTreeNode(PBSTree &t, int key)
{
if(!t)
{
return false;
}
else
{
if(t->data == key)
{
PBSTree p=NULL;
PBSTree q=NULL;
if(NULL ==t->left) 
{
p = t;
t = t->right;
delete p;
}
else if(NULL == t->right)
{
p = t;
t = t->left;
delete p;
}
else
{
p=q=NULL;
p = t;
q = t->left;
while(q->right)
{
p = q; 
q = q->right;
}
t->data = q->data;
if(p != t)
{
p ->right = q->left;
}
else
{
p->left = q->left;
}


delete q;
 
}
return true;


}
else if(t->data > key)
{
return DeleteBSTreeNode(t->left , key);
}
else
{
return DeleteBSTreeNode(t->right, key);
}


}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值