/*
快速排序
*/
#include<iostream>
using namespace std;
int a[8] = {2,8,7,1,3,5,6,4};
int sz = sizeof(a)/sizeof(int);
int Partition(int a[],int p,int r)
{
int i=p-1;//标志小数部分的尾部
//j标志未排序部分的开头
for(int j=p;j<=r-1;++j){
if(a[j]<a[r]){
swap(a[j],a[i+1]);
i++;
}
}
swap(a[r],a[i+1]);
return i+1;
}
void QuickSort(int a[],int p,int r)
{
if(p >= r)
return;
int q = Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
int main()
{
QuickSort(a,0,sz-1);
for(int i=0;i<sz;++i)
cout<<a[i]<<" ";
return 0;
}
/*
堆排序 基于数组
*/
#include<iostream>
using namespace std;
int a[8] = {5,2,4,7,1,3,2,6};
const int sz = sizeof(a)/sizeof(int);
//堆化:保持最大堆的性质
void MaxHeapify(int a[],int i,int sz)
{
int left = 2*i+1;
int right = 2*i+2;
while(left<sz){
if(a[i]<a[left]){
swap(a[i],a[left]);
i = left;
left = 2*i+1;
}
else if(right < sz && a[i]<a[right]){
swap(a[i],a[right]);
i = right;
right = 2*i+2;
}
else
break;
}
}
void BuildMaxHeap(int a[])
{
for(int i=sz/2-1;i>=0;--i) //自低向上,从第一个非叶子的节点开始“堆化”每个节点
MaxHeapify(a,i,sz);
}
void HeapSort(int a[])
{
BuildMaxHeap(a);
int temp = sz;
for(int i=sz-1;i>=1;--i){
swap(a[0],a[i]);
temp--;
MaxHeapify(a,0,temp);
}
}
int main()
{
// BuildMaxHeap(a);
HeapSort(a);
for(int i=0;i<sz;++i)
cout<<a[i]<<" ";
return 0;
}
/*
归并排序
分治法
参照算法导论伪代码编写
*/
#include<iostream>
using namespace std;
int a[8] = {5,2,4,7,1,3,2,6};
int sz = sizeof(a)/sizeof(int);
void Merge(int a[],int p,int q,int r)
{
int n1 = q - p +1;
int n2 = r - q;
//创建两个辅助数组
int *left = new int[n1+1]; //创建左数组
int *right = new int[n2+1]; //创建右数组
for(int i=0;i<n1;++i)
left[i] = a[p+i]; //得到左数组
for(int i=0;i<n2;++i) //得到右数组
right[i] = a[q+i+1];
left[n1] = INT_MAX;
right[n2] = INT_MAX;
int ii=0;
int j=0;
for(int k=p;k<=r;++k){ //从左数组和右数组中取出最小的元素,依次放入a中对应的位置
if(left[ii]<=right[j]){
a[k] = left[ii];
ii++;
}
else{
a[k] = right[j];
j++;
}
}
delete [] left;
delete [] right;
}
void Merge_Sort(int a[],int p,int r)
{
if(p == r)
return;
int q = (p+r)/2;
Merge_Sort(a,p,q);
Merge_Sort(a,q+1,r);
Merge(a,p,q,r);
}
int main()
{
Merge_Sort(a,0,sz-1);
for(int i=0;i<sz;++i)
cout<<a[i]<<" ";
return 0;
}