#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 7
typedef int ElemType;
typedef struct
{
ElemType *elem;
int TableLen;
}SSTable;
void ST_Init(SSTable &ST,int len)
{
ST.TableLen=len;
ST.elem=(ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
}
void ST_print(SSTable ST)
{
int i;
for(i=0;i<ST.TableLen;i++)
{
printf("%3d",ST.elem[i]);
}
printf("\n");
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
//冒泡排序
void BubbleSort(ElemType *arr,int n)
{
int i,j;
bool flag;
for(i=0;i<n-1;i++)
{
flag=false;
for(j=n-1;j>i;j--)
{
if(arr[j-1]>arr[j])
{
swap(arr[j-1],arr[j]);
flag=true;
}
}
if(false==flag)
{
return ;
}
}
}
//快速排序
int QuickSort(ElemType arr[],int low,int high)
{
ElemType pivot=arr[low];
while(low<high)
{
while(low<high&&arr[high]>pivot)
high--;
arr[low]=arr[high];
while(low<high&&arr[low]<pivot)
low++;
arr[high]=arr[low];
}
arr[low]=pivot;
return low;
}
//插入排序
void InsertSort(ElemType arr[],int n)
{
int i,j,insertVal;
for(i=1;i<n;i++)
{
insertVal=arr[i];
for(j=i-1;j>=0&&arr[j]>insertVal;j--)
{
arr[j+1]=arr[j];
}
arr[j+1]=insertVal;
}
}
//选择排序
void SelectionSort(ElemType arr[],int n)
{
int i,j,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(arr[j]<arr[min])
{
min=j;
}
}
if(min!=i)
{
swap(arr[i],arr[min]);
}
}
}
//把某个子树调整为大根堆
void AdjustDown(ElemType arr[],int k,int n)
{
int dad=k;
int son=2*dad+1;//zuo
while(son<n)
{
if(son+1<n&&arr[son]<arr[son+1])
{
son++;
}
if(arr[son]>arr[dad])
{
swap(arr[son],arr[dad]);
dad=son;
son=2*dad+1;
}else{
break;
}
}
}
//堆排序
void HeadSort(ElemType arr[],int n)
{
int i;
for(i=n/2-1;i>=0;i--)
{
AdjustDown(arr,i,n);
}
swap(arr[0],arr[n-1]);
for(i=n-1;i>0;i--)
{
AdjustDown(arr,0,i);
swap(arr[0],arr[i-1]);
}
}
//实现合并两个有序数组
void Merge(ElemType A[],int low,int mid,int high)
{
static ElemType B[N];
int i,j,k;
for(i=low;i<=high;i++)
{
B[i]=A[i];
}
k=low;
for(i=low,j=mid+1;i<=mid&&j<=high;)
{
if (B[i] < B[j])
{
A[k] = B[i];
i++;
k++;
} else {
A[k] = B[j];
j++;
k++;
}
}
while(i<=mid)
{
A[k]=B[i];
i++;
k++;
}
while(j<=high)
{
A[k]=B[j];
j++;
k++;
}
}
//归并排序
void MergeSort(ElemType A[],int low,int high)//递归分割
{
if(low<high)
{
int mid=(low+high)/2;
MergeSort(A,low,mid);//排序好前一半
MergeSort(A,mid+1,high);//排序好后一半
Merge(A,low,mid,high);//讲两个排序好的数组合并
}
}
void print(int a[])
{
for(int i=0;i<N;i++)
{
printf("%3d",a[i]);
}
printf("\n");
}
int main()
{
SSTable ST;
ST_Init(ST,10);
ElemType arr[10];
int i;
for(i=0;i<10;i++)
{
scanf("%d",&arr[i]);//87 7 60 80 59 34 86 99 21 3,3 87 2 93 78 56 61 38 12 40
}
memcpy(ST.elem,arr,sizeof(arr));
BubbleSort(ST.elem,10);
ST_print(ST);
QuickSort(ST.elem,0,9);
ST_print(ST);
InsertSort(ST.elem,10);
ST_print(ST);
SelectionSort(ST.elem,10);
ST_print(ST);
HeadSort(ST.elem,10);
ST_print(ST);
int A[N]={49,38,65,97,76,13,27};
MergeSort(A,0,6);
print(A);
return 0;
}